确定应该怎样具体地实现所要求的系统。
详细设计阶段的任务不是具体地编写程序,而是要设计出程序的“蓝图”。
详细设计的结果基本上决定了最终的程序代码的质量
衡量程序的质量不仅要看它的逻辑是否正确,性能是否满足要求,更重要的是要看它是否容易阅读和理解
结构程序设计
“顺序”、“选择”和“循环”控制结构
结构程序设计经典定义:如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。
结构程序设计更全面的定义:结构程序设计是尽可能少 用GO TO语句的程序设计方法。最好仅在检测出错误时才使用 GO TO语句,而且应该总是使用前向GO TO语句
如果只允许使用顺序、IF-THEN-ELSE型分支和DO-WHILE 型循环这3种基本控制结构,则称为经典的结构程序设计;
如果除了上述3种基本控制结构之外,还允许使用DOCASE型多分支结构和DO-UNTIL型循环结构,则称为扩展的结构程序设计;
如果再允许使用LEAVE(或BREAK)结构,则称为修正的结构程序设计
人机界面设计
设计问题
①系统响应时间(注重用户体验)
系统响应时间指从用户完成某个控制动作(例如,按回车键或单击鼠标),到软件给出预期的响应(输出信息或做动作)之间的这段时间。 系统响应时间有两个重要属性,分别是长度和易变性。
长度:时间过长,用户就会感到紧张;过短,加快用户操作节奏, 可能会犯错误。
易变性:系统响应时间相对于平均响应时间的偏差即使系统响应时间较长,响应时间易变性低也有助于用户建立起稳定的工作节奏
②用户帮助设施
常见的帮助设施可分为集成的和附加的两类。 具体设计帮助设施时,必须解决下述的一系列问题。
在用户与系统交互期间,是否在任何时候都能获得关于系统任何功能的帮助信息?有两种选择:提供部分功能的帮助信息和提供全部功能的帮助信息。
用户怎样请求帮助?有3种选择:帮助菜单,特殊功能键和HELP命令。
怎样显示帮助信息?有3种选择:在独立的窗口中,指出参考某个文档(不理想)和在屏幕固定位置显示简短提示。
用户怎样返回到正常的交互方式中?有两种选择:屏幕上的返回按钮和功能键。
怎样组织帮助信息?有3种选择:平面结构,信息的层次结构和超文本结构。
③ 出错信息处理(出了什么错、怎么改、后果)
出错信息和警告信息,是出现问题时交互式系统给出的“坏消息”。一般说来,交互式系统给出的出错信息或警告信息,具有下 述属性。
用用户可以理解的术语描述问题;
提供有助于从错误中恢复的建设性意见;
指出错误可能导致哪些负面后果(例如,破坏数据文件),以便用户检查是否出现了这些问题,并在确实出现问题时及时解决;
伴随着听觉上或视觉上的提示;
不能带有指责色彩,不能责怪用户
④ 命令交互
许多高级用户仍然偏爱面向命令行的交互方式,在提供命令交互方式时,必须考虑下列设计问题。
是否每个菜单选项都有对应的命令?
采用何种命令形式?有3种选择:控制序列/快捷键(例如Ctrl+P),功能键和输入命令;
学习和记忆命令的难度有多大?忘记了命令怎么办?
用户是否可以定制或缩写命令?
在理想的情况下,所有应用软件都有一致的命令使用方法
设计过程
用户界面设计是一个迭代的过程,通常先创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户意见进行修改。 建立起用户界面的原型,就必须对它进行评估,评估可以是非正式的也可以是正式的。
创建了用户界面的设计模型之后,可以运用下述评估标准对设计进行早期复审。
(1) 系统及其界面的规格说明书的长度和复杂程度,预示了用户学习使用该系统所需要的工作量。
(2) 命令或动作的数量、命令的平均参数个数或动作中单个操作的个数,预示了系统的交互时间和总体效率。
(3) 设计模型中包含的动作、命令和系统状态的数量,预示了用户学习使用该系统时需要记忆的内容的多少。
(4) 界面风格、帮助设施和出错处理协议,预示了界面的复杂程度及用户接受该界面的程度
人机界面设计指南
① 一般交互指南:涉及信息显示、数据输入和系统整体控制
- 保持一致性(设计的功能具有一致的格式)
- 提供有意义的反馈(视觉、听觉)
- 在执行有较大破坏性的动作之前要求用户确认
- 允许取消绝大多数操作
- 减少在两次操作之间必须记忆的信息量
- 提高对话、移动和思考的效率
- 允许犯错误
- 按功能对动作分类,并据此设计屏幕布局
- 提供对用户工作内容敏感的帮助设施
- 用简单动词或动词短语作为命令名
② 信息显示指南:多种不同方式“显示”信息:用文字、图形和声音;按位置、移动和大小;使用颜色、分辨率和省略。
- 只显示与当前工作内容有关的信息
- 不要用数据淹没用户,应该用便于用户迅速吸取信息的方式(图形、图表)来表示数据
- 使用一致的标记、标准的缩写和可预知的颜色
- 允许用户保持可视化的语境
- 产生有意义的出错信息
- 使用大小写、缩进和文本分组以帮助理解
- 使用窗口分隔不同类型的信息
- 使用“模拟”显示方式表示信息,以使信息更容易被用户提取(提供绝对和相对两方面的信息,如:压力表设计成温度计的样子)
- 高效率地使用显示屏
③ 数据输入指南:用户的大部分时间用在选择命令、输入数据和向系统提供输入
- 尽量减少用户的输入动作(选、滑、宏)
- 保持信息显示和数据输入之间的一致性
- 允许用户自定义输入
- 交互应该是灵活的,并且可调整成用户最喜欢的输入方式
- 使在当前动作语境中不适用的命令不起作用
- 让用户控制交互流
- 对所有输入动作都提供帮助(鼠标停留显示帮助)
- 消除冗余的输入(不要求用户输入单位、提供默认值、绝对不能要求用户提供程序可以自动获得或者计算出来的信息)
过程设计的工具
程序流程图/程序框图
(a) 选择(分支); (b) 注释; (c) 预先定义的处理; (d) 多分支; (e) 开始或停止; (f) 准备; (g) 循环上界限; (h) 循环下界限; (i) 虚线; (j) 省略符; (k) 并行方式; (l) 处理; (m) 输入输出; (n) 连接; (o) 换页连接; (p) 控制流
程序流程图的主要缺点如下
(1) 程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构。
(2) 程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。
(3) 程序流程图不易表示数据结构
盒图/N-S图(一种不允许违背结构程序设计精神的图形工具 )
它有下述特点。
(1) 功能域(即一个特定控制结构的作用域)明确,可以从盒图上一眼就看出来。
(2) 不可能任意转移控制。
(3) 很容易确定局部和全程数据的作用域。
(4) 很容易表现嵌套关系,也可以表示模块的层次结构
图给出了结构化控制结构的盒图表示,也给出了调用子程序的盒图表示方法。
其中基本符号(a) 顺序; (b) IF_THEN_ELSE 型分支; (c) CASE型 多分支; (d) 循环; (e) 调用子程序A
PAD
问题分析图 (problem analysis diagram) 的英文缩写,用二维树形结构的图来表示程序的控制
基本符号
(a) 顺序(先执行P1后执行P2); (b) 选择(IF C THEN P1 ELSE P2); (c) CASE型多分支; (d) WHILE型循环(WHILE C DO P); (e) UNTIL型循环(REPEAT P UNTIL C); (f) 语句标号; (g) 定义
PAD图的主要优点如下:
(1) 使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化程序。
(2) PAD图所描绘的程序结构十分清晰。
(3) 用PAD图表现程序逻辑,易读、易懂、易记。
(4) 容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成,从而可省去人工编码的工作,有利于提高软件可靠性和软件生产率。
(5) 即可用于表示程序逻辑,也可用于描绘数据结构。
(6) PAD图的符号支持自顶向下、逐步求精方法的使用。
判定表
判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。
判定表由4部分组成,左上部列出所有条件,左下部是所有可能做的动作,右上部是表示各种条件组合的一个矩阵,右下部是和每种条件组合相对应的动作。 判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作
判定树
判定树是判定表的变种,它也能清晰地表示复杂的条件组合与应做的动作之间的对应关系
过程设计语言(PDL)/伪码
过程设计语言(PDL)也称为伪码,是用正文形式表示数据和处理过程的设计工具。
PDL有下述特点:
(1)关键字的固定语法,它提供了结构化控制结构、数据说明和模块化的特点。如,if…fi(或endif)等 ??
(2) 自然语言的自由语法,它描述处理特点 ??
(3) 数据说明的手段,应该既包括简单的数据结构(例如纯量和数组),又包括复杂的数据结构(例如,链表或层次的数据结构) (4) 模块定义和调用的技术,应该提供各种接口描述模式
PDL有下述优点:
可以作为注释直接插在源程序中间
可以使用普通的正文编辑程序或文字处理系统,很方便地完成 PDL的书写和编辑工作
已经有自动处理PDL的程序存在,而且可以自动由PDL生成程序代码
PDL的缺点是不如图形工具形象直观,描述复杂的条件组合与动作间的对应关系时,不如判定表清晰简单
面向数据结构的设计方法
Jackson图
顺序结构:A由B、C、D 3个元素顺序组成(每个元素只出现一次,出现的次序依次是B、C 和D)
选择结构:根据条件A等于B或C或 D中的某一个(注意,在 B、C和D的右上角有小圆圈做标记)
重复结构:A由B出现N次(N≥0) 组成(注意,在B的右上角有星号标记)
改进的Jackson图
顺序结构,B、C、D中任一个都不能是选择出现或重复出现的数据元素(即不能是右上角有小圆圈或星号标记的元素);
选择结构,S右面括号中的数字i是分支条件的编号;
可选结构,A或者是元素B或者不出现;
重复结构,循环结束条件的编号为i
程序复杂程度的定量度量
定量度量程序复杂程度的方法很有价值:(软件测试的终止条件)
a) 把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量;
b) 定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣;
c) 程序的定量的复杂程度可以作为模块规模的精确限度
McCabe方法
① 流图
McCabe方法根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。流图实质上是“退化了的”程序流程图,描绘程序的控制流程,不表现对数据的具体操作以及分支或循环的具体条件。
一个圆代表一条或多条语句;
一个顺序结构可以合并一个结点;
流图中的箭头线称为边,代表控制流;
在流图中一条边必须终止于一个结点
② 计算环形复杂度的方法
(依据流图计算)
流图的环形复杂度等于流图中线性无关的区域数
流图G的环形复杂度V(G)=E-N+2, 其中,E是流图中边的条数,N是结点数
流图G的环形复杂度V(G)=P+1, 其中,P是流图中判定结点的数目
流图中有两条输出弧的结点对应于程序中的一 个判断,有n(n>2)条输出弧的结点对应于程序中的n-1个判断
③ 环形复杂度的用途
对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。实践表明,模块规模以V(G)≤10为宜
Halstead方法
根据程序中运算符和操作数的总数来度量程序的复杂程度。
令N1为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N(实际程序长度)定义为:N=N1+N2
程序中使用的不同运算符(包括关键字)的个数n1,以及不同操作数(变量和常数)的个数n2。
Halstead给出预测程序长度的公式如下: H=n1 log2n1+n2 log2n2
多次验证都表明,预测的长度H与实际长度N非常接近。
Halstead还给出了预测程序中包含错误的个数的公式如下: E=N log2 (n1+n2)/3000
常量和变量作为操作数,把其它符号视为预算符, 因此,逗号,分号,圆括号,方括号,算术运算符,逻辑运算符等都是运算符