第六章 详细设计
第六章内容概要 详细设计概要 结构程序设计 人机界面设计 过程设计技术和工具 程序复杂程度的定量度量 ★ 软件工程 - 2011 - 第六章 详细设计
详细设计概要 详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统。 详细设计的目标不仅仅是逻辑上正确地实现每个模块的功能,更重要的是设计出的处理过程应该尽可能的简明易懂。 结构程序设计是实现上述目标的关键技术,是详细设计的逻辑基础。 软件工程 - 2011 - 第六章 详细设计
第六章内容概要 详细设计概要 结构程序设计 人机界面设计 过程设计技术和工具 程序复杂程度的定量度量 ★ 软件工程 - 2011 - 第六章 详细设计
结构程序设计 结构程序设计的概念最早由E.W.Dijkstra在1965年提出,他指出:“可以从高级语言中取消GOTO语句”,“程序的质量与程序中所包含的GOTO语句的数量成反比”。 1966年Bohm和Jacopini证明了,只用3种基本的控制结构就能实现任何单入口单出口的程序。这3种基本的控制结构是“顺序”、“选择”和“循环”。 1968年Dijkstra再次建议,1971年IBM成功地应用结构程序设计在纽约时报信息库管理系统和美国宇航局飞行模拟实验中 软件工程 - 2011 - 第六章 详细设计
结构程序设计 结构程序设计的经典定义如下所述:“如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。” 对经典定义的扩充“结构程序设计是尽可能少用GOTO语句的程序设计方法。最好仅在检测出错误时才使用GOTO语句,而且应该总是使用前向GOTO语句。” 软件工程 - 2011 - 第六章 详细设计
结构程序设计 经典的结构程序设计:如果只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE型循环这3种基本控制结构实现单入口单出口的程序 扩展的结构程序设计:如果除了上述3种基本控制结构之外,还允许使用DO-CASE型多分支结构和DO-UNTIL型循环结构 修正的结构程序设计:如果再加上允许使用LEAVE(或BREAK)结构 软件工程 - 2011 - 第六章 详细设计
结构程序设计 软件工程 - 2011 - 第六章 详细设计
结构程序设计 软件工程 - 2011 - 第六章 详细设计
第六章内容概要 详细设计概要 结构程序设计 人机界面设计 过程设计技术和工具 程序复杂程度的定量度量 ★ 软件工程 - 2011 - 第六章 详细设计
设计问题 系统响应时间 用户帮助设施 出错信息处理 命令交互 软件工程 - 2011 - 第六章 详细设计
系统响应时间 系统响应时间:指从用户完成某个控制动作(例如,按回车键或点击鼠标),到软件给出预期的响应(输出信息或做动作)之间的这段时间 两个属性 长度 易变性 软件工程 - 2011 - 第六章 详细设计
用户帮助设施 帮助设施分为集成的和附加的两类 具体设计帮助设施时,必须解决的问题 在用户与系统交互期间,是否在任何时候都能获得关于系统任何功能的帮助信息?(提供部分功能的帮助信息和提供全部功能的帮助信息) 用户怎样请求帮助?(帮助菜单、特殊功能键和HELP命令) 怎样显示帮助信息?(在独立的窗口中、指出参考某个文档和在屏幕固定位置显示简短提示) 用户怎样返回到正常的交互方式中?(屏幕上的返回按钮和功能键) 怎样组织帮助信息?(平面结构,信息的层次结构和超文本结构) 软件工程 - 2011 - 第六章 详细设计
出错信息处理 交互式系统给出的出错信息或警告信息,应具备的属性: 信息应该用用户可以理解的术语描述问题。 信息应该提供有助于从错误中恢复的建设性意见。 信息应该指出错误可能导致哪些负面后果 信息应该伴随着听觉上或视觉上的提示 信息不能带有指责色彩 软件工程 - 2011 - 第六章 详细设计
命令交互 在提供命令交互方式时,必须考虑的设计问题: 是否每个菜单选项都有对应的命令 采用何种命令形式(控制序列(例如,Ctrl+P),功能键和键入命令) 学习和记忆命令的难度有多大 用户是否可以定制或缩写命令 软件工程 - 2011 - 第六章 详细设计
设计过程 初步设计 创建界面原型1 创建界面原型n 用户评审界面 修改设计 设计者研究用户评审意见 界面设计完毕 软件工程 - 2011 - 第六章 详细设计
人机界面设计指南 一般交互指南 保持一致性 提供有意义的反馈 在执行有较大破坏性的动作之前要求用户确认 允许取消绝大多数操作 减少在两次操作之间必须记忆的信息量 提高对话、移动和思考的效率 允许犯错误 按功能对动作分类,并据此设计屏幕布局 提供对用户工作内容敏感的帮助设施 用简单动词或动词短语作为命令名 软件工程 - 2011 - 第六章 详细设计
人机界面设计指南 信息显示指南 只显示与当前工作内容有关的信息 不要用数据淹没用户 使用一致的标记、标准的缩写和可预知的颜色 允许用户保持可视化的语境 产生有意义的出错信息 使用大小写、缩进和文本分组以帮助理解 使用窗口分隔不同类型的信息 使用“模拟”显示方式表示信息 高效率地使用显示屏 软件工程 - 2011 - 第六章 详细设计
人机界面设计指南 数据输入指南 尽量减少用户的输入动作 保持信息显示和数据输入之间的一致性 允许用户自定义输入 交互应该是灵活的,并且可调整成用户最喜欢的输入方式 使在当前动作语境中不适用的命令不起作用 让用户控制交互流 对所有输入动作都提供帮助 消除冗余的输入 软件工程 - 2011 - 第六章 详细设计
第六章内容概要 详细设计概要 结构程序设计 人机界面设计 过程设计技术和工具 程序复杂程度的定量度量 ★ 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 表达过程规格说明的工具叫做详细设计工具: 图形工具 表格工具 语言工具 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 程序流程图(Program Flow Chart) 程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。 程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。 程序流程图不易表示数据结构。 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 必须限制程序流程图只能使用五种基本的控制结构 需要对流程图所用的符号做出确切的规定 软件工程 - 2011 - 第六章 详细设计
软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 盒图(Box-Diagram)(N-S图) Nassi和Shneiderman提出 T F 条件 ELSE部分 第一个任务 第二个任务 第三个任务 (a) T F 条件 ELSE部分 THEN部分 (b) CASE条件 值2 值n CASE 2 部分 CASE n … 值1 CASE 1 (c) 循环条件 DO_WHILE DO_UNTIL (d) A (e) 软件工程 - 2011 - 第六章 详细设计
示例 软件工程 - 2011 - 第六章 详细设计
N-S图的嵌套定义形式 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 盒图有下述特点: 功能域(即某个特定控制结构的作用域)明确,可以从盒图上一眼就看出来。 不可能任意转移控制。 很容易确定局部和全程数据的作用域。 很容易表现嵌套关系,也可以表示模块的层次结构。 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 PAD(Problem Analysis Diagram)图:1973年由日本日立公司发明 用二维树形结构的图来表示程序的控制流, 设置了五种基本控制结构的图式,并允许递归使用。 软件工程 - 2011 - 第六章 详细设计
PAD描述的示例 软件工程 - 2011 - 第六章 详细设计
PAD的扩充控制结构 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 PAD图的主要优点: 使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化程序 即可用于表示程序逻辑,也可用于描绘数据结构 PAD图的符号支持自顶向下、逐步求精方法的使用 软件工程 - 2011 - 第六章 详细设计
课堂练习 画出下列程序流程图对应的PAD图 Begin A B Q P End N Y 软件工程 - 2011 - 第六章 详细设计
A B while P Q T 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 判定表 当算法中包含多重嵌套的条件选择时,使用判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。 判定表用于表示程序的静态逻辑。 在判定表中的条件部分给出所有的两分支判断的列表,动作部分给出相应的处理。 要求将程序流程图中的多分支判断都改成两分支判断。 软件工程 - 2011 - 第六章 详细设计
无多分支判断结构 软件工程 - 2011 - 第六章 详细设计
软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 判定表 优点:能够简洁、无二义性地描述所有的处理规则。 缺点:判定表表示的是静态逻辑,是在某种条件取值组合情况下可能的结果,它不能表达加工的顺序,也不能表达循环结构,因此判定表不能成为一种通用的设计工具。 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 以行李托运费的算法为例说明判定表的组织方法。假设某航空公司规定,乘客可以免费托运重量不超过30kg的行李。当行李重量超过30kg时,对头等舱的国内乘客超重部分每公斤收费4元,对其他舱的国内乘客超重部分每公斤收费6元,对外国乘客超重部分每公斤收费比国内乘客多一倍,对残疾乘客超重部分每公斤收费比正常乘客少一半。 软件工程 - 2011 - 第六章 详细设计
1 2 3 4 5 6 7 8 9 国内乘客 T F 头等舱 残疾乘客 免费 × (W-30) ×2 (W-30) ×3 (W-30) ×4 行李重量W≤30kg 免费 × (W-30) ×2 (W-30) ×3 (W-30) ×4 (W-30) ×6 (W-30) ×8 (W-30) ×12 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 判定树 判定树是判定表的变种。 优点:形式简单,比判定表更直观 缺点: 简洁性不如判定表 画判定树时分枝的次序可能对最终画出的判定树的简洁程度有较大影响 软件工程 - 2011 - 第六章 详细设计
软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 过程设计语言(PDL) 是用正文形式表示数据和处理过程的设计工具,也被称为伪代码。 PDL具有严格的关键字外部语法,用于定义控制结构和数据结构;另一方面,PDL表示实际操作和条件的内部语法通常又是灵活自由的,可以适应各种工程项目的需要。 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 PROCEDURE spellcheck IS 查找错拼的单词 BEGIN split document into single words 把整个文档分离成单词 look up words in dictionary 在字典中查这些单词 display words which are not in dictionary 显示字典中查不到的单词 create a new dictionary 造一新字典 END spellcheck 示例: 拼写检查程序 软件工程 - 2011 - 第六章 详细设计
过程设计技术和工具 PDL作为一种设计工具有如下一些优点: 软件工程 - 2011 - 第六章 详细设计
第六章内容概要 详细设计概要 结构程序设计 人机界面设计 过程设计技术和工具 程序复杂程度的定量度量 ★ 软件工程 - 2011 - 第六章 详细设计
程序复杂程度的定量度量 定量度量程序复杂程度的方法的用途: 把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量; 定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣; 程序的定量的复杂程度可以作为模块规模的精确限度。 软件工程 - 2011 - 第六章 详细设计
McCabe方法 McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。 流图(也称为程序图):实质上是“退化了的”程序流程图,它仅仅描绘程序的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。 结点:用圆表示,代表一条或多条语句; 边:用箭头表示,一边必须终止于一个结点; 区域:由边和结点围成的面积 ; 软件工程 - 2011 - 第六章 详细设计
McCabe方法 流程图、流图以及E、N、V的对应关系: 1 2 顺序型 选择型 4 2 软件工程 - 2011 - 第六章 详细设计
McCabe方法 流程图、流图以及E、N、V的对应关系: 3 2 3 2 WHILE 循环 UNTIL 循环 软件工程 - 2011 - 第六章 详细设计
McCabe方法 流程图、流图以及E、N、V的对应关系: 示例 7 6 3 软件工程 - 2011 - 第六章 详细设计
McCabe方法 9 10 1 3 6 2 4 7 8 5 11 ( a ) 1 2,3 4,5 10 11 9 8 7 6 R3 R2 R1 R4 结点 边 区域 (b) 把程序流程图映射成流图 软件工程 - 2011 - 第六章 详细设计
1:do while records remain 2 : read record; if record field 1=0 PDL Procedure:sort 1:do while records remain 2 : read record; if record field 1=0 3 : then process record; store in buffer; increment counter; 4 : elseif record field 2=0 5 : then reset counter; 6 : else process record; store in file; 7a : endif endif 7b : enddo 8 : end 1 2 3 7b 8 7a 5 6 4 图6.16 由PDL翻译成的流图 软件工程 - 2011 - 第六章 详细设计
包含复合条件的PDL映射成的流图 IF a OR b then procedure x else procedure y ENDIF 判定节点 ……… IF a OR b then procedure x else procedure y ENDIF ……… IF a AND b then procedure x else procedure y ENDIF 软件工程 - 2011 - 第六章 详细设计
McCabe方法 有了描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度。 流图中的区域数等于环形复杂度。 流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。 流图G的环形复杂度V(G)=P+1,其中,P是流图中判断的数目。 例如,使用上述任何一种方法,都可以计算出书中图6.16所示流图的环形复杂度为4。 软件工程 - 2011 - 第六章 详细设计
McCabe方法 环形复杂度的用途 为单元或构件的控制流复杂度提供量化表示。 用于查明潜在的不稳定区域。 表示一个单元或构件的可测试性、可理解性和可维护性。 McCabe从大量的调查中发现,当V(G)等于或大于10时,对模块进行充分的测试将变得非常困难。他主张将10作为环域数的上限,并以此来限制模块的最大规模。 计算基本路径测试中的路径数目。 描述测试一个单元或构件所需的工作量。 软件工程 - 2011 - 第六章 详细设计
McCabe方法 这种度量的缺点: 对于不同种类的控制流的复杂性不能区分; 简单IF语句与循环语句的复杂性同等看待; 嵌套IF语句与简单CASE语句的复杂性是一样的; 一个具有1000行的顺序程序与一行语句的复杂性相同; 软件工程 - 2011 - 第六章 详细设计
课堂练习(画出下列程序流程图对应的流图) Start DO WHILE C1 End C A E D B C2 软件工程 - 2011 - 第六章 详细设计
Halstead方法 它根据程序中运算符和操作数的总数来度量程序的复杂程度。 运算对象包括变量名和常数 运算符包括: 算术运算符 赋值符(= 或 := ) 数组操作符 逻辑运算符 分界符(,或 ;或 : ) 子程序调用符 关系运算符 括号运算符 循环操作符等 特别地,成对的运算符,例如“BEGIN…END”、 “FOR…TO”、“REPEAT …UNTIL”、“WHILE…DO”、 “IF…THEN…ELSE”、“(…)”等都当做单一运算符。 运算对象包括变量名和常数 软件工程 - 2011 - 第六章 详细设计
Halstead方法 ① 程序长度,即预测的Halstead长度 H = n1×log2n1+ n2×log2n2 软件工程 - 2011 - 第六章 详细设计
Halstead方法 ② 实际的Halstead长度 经过多次验证,预测的Halstead长度与实际的Halstead长度是非常接近的。 设N1为程序中实际出现的运算符总个数, N2为程序中实际出现的运算对象总个数, N为实际的Halstead长度,则有 N = N1 + N2 经过多次验证,预测的Halstead长度与实际的Halstead长度是非常接近的。 软件工程 - 2011 - 第六章 详细设计
Halstead方法 ③ 程序的词汇表 ④ 程序量V,可用下式算得 V = ( N1 + N2 ) × log2 ( n1 + n2 ) Halstead定义程序的词汇表为不同的运算符种类数和不同的运算对象种类数的总和。若令n为程序的词汇表,则有 n = n1 + n2 ④ 程序量V,可用下式算得 V = ( N1 + N2 ) × log2 ( n1 + n2 ) 软件工程 - 2011 - 第六章 详细设计
运算符 计数 运算对象 可执行语句结束 7 X 6 数组下标 I 5 = J 4 IF() 2 N DO , SAVE 程序结束 1 .LT. n2=7 N2=22 .GE. GO TO 10 n1=10 N1=28 SUBROUTINE SORT(X,N) DIMENSION X(N) IF(N .LT. 2) RETURN DO 20 I = 2, N DO 10 J = 1, I IF (X(I).GE. X(J)) GO TO 10 SAVE = X(I) X(I)= X(J) X(J)= SAVE 10 CONTINUE 20 CONTINUE RETURN END H = 10 × log2 10 + 7 × log2 7 = 52.87 N = N1 + N2 = 28 + 22 = 50 V=( 28 + 22 ) × log2 ( 10 + 7 ) = 204 运算符 运算对象 软件工程 - 2011 - 第六章 详细设计
Halstead方法 ⑤ 程序的潜在错误 Halstead度量可以用来预测程序中的错误。 认为程序中可能存在的差错应与程序的容量成正比。因而预测公式为 B = ( N1 + N2 ) × log2 ( n1 + n2 )∕3000 = V∕3000 B表示该程序的错误数。 它表明程序中可能存在的差错B应与程序量V成正比。 例如,一个程序对75个数据库项共访问1300次,对150个运算符共使用了1200次,那么预测该程序的错误数: B = ( 1300 + 1200 )×log2 ( 75 + 150 )∕3000 = 6.5 即预测该程序中可能包含6~7个错误。 软件工程 - 2011 - 第六章 详细设计
Halstead方法 Halstead的重要结论 程序的实际Halstead长度N可以由词汇表n算出。即使程序还未编制完成,也能预先算出程序的实际Halstead长度N, 虽然它没有明确指出程序中到底有多少个语句。 这个结论非常有用。经过多次验证,预测的Halstead长度与实际的Halstead长度是非常接近的。 软件工程 - 2011 - 第六章 详细设计