文章目录
- 1. 结构程序设计
- 2. 人机界面设计
- 2.1. 人机界面设计概述
- 2.2. 人机界面设计问题
- 2.3. 人机界面设计过程
- 3. 过程设计工具
- 3.1. 程序流程图
- 3.2. 盒图(N-S图)
- 3.3. PAD图
- 3.4. 判定表(决策表)
- 3.5. 判定树(决策树)
- 3.6. 过程设计语言
- 4. 面向数据结构的设计方法
- 4.1. 面向数据结构的设计方法概述
- 4.2. Jackson图
- 4.4. Jackson方法
- 5. 程序复杂程度的定量度量
- 5.1. 程序复杂程度的定量度量概述
- 5.2. McCabe方法
- 5.3. Halstead方法
1. 结构程序设计
详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统。经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。
结构程序设计技术是实现上述目标的关键技术,因此是详细设计的逻辑基础。
结构程序设计的经典定义是:如果一个程序的代码块仅仅通过顺序、选择和循环这3种基本控制结构进行连接,并且每个代码块只有一个入口和一个出口,则称这个程序是结构化的。为了实际使用方便起见,常常还允许使用DO-UNTIL和DO-CASE两种控制结构。
有时需要立即从循环(甚至嵌套的循环)中转移出来,允许使用LEAVE(或BREAK)结构。LEAVE或BREAK结构实质上是受限制的GOTO语句,用于转移到循环结构后面。
2. 人机界面设计
2.1. 人机界面设计概述
人机界面设计是接口设计的重要组成部分。对于交互式系统来说,人机界面设计和数据设计、体系结构设计及过程设计一样重要。
人机界面的设计质量,直接影响用户对软件产品的评价,从而影响软件产品的竞争力和寿命,必须对人机界面设计给予足够重视。
人机界面设计有三条黄金规则:
- 界面要置用户于控制之下;
- 界面内容要减少用户记忆负担;
- 各个保持界面一致。
2.2. 人机界面设计问题
设计人机界面过程中会遇到的4个问题:
- 系统响应时间
系统响应时间指从用户完成某个控制动作,到软件给出预期的响应之间的这段时间。系统响应时间有两个重要属性:长度和易变性。
长度:如果系统响应时间过长,用户就会感到紧张和沮丧;系统响应时间过短会迫使用户加快操作节奏,从而可能会犯错误。
易变性:指系统响应时间相对于平均响应时间的偏差,即使系统响应时间较长,响应时间易变性低也有助于用户建立起稳定的工作节奏。 - 用户帮助设施
大多数现代软件都提供联机帮助设施,用户无须离开用户界面就能解决自己的问题。常见的帮助设施可分为集成的和附加的两类。
集成的帮助设施设计在软件里面,它对用户工作内容是敏感的,用户可以从与刚刚完成的操作有关的主题中选择一个请求帮助。
附加的帮助设施是在系统建成后再添加到软件中的,它实际上是一种查询能力有限的联机用户手册。集成的帮助设施优于附加的帮助设施。 - 出错信息处理
出错信息和警告信息,是出现问题时交互式系统给出的“坏消息”。 - 命令交互
多数情况下,用户既可以从菜单中选择软件功能,也可以通过键盘命令序列调用软件功能。在理想的情况下,所有应用软件都有一致的命令使用方法。
2.3. 人机界面设计过程
用户界面设计是一个迭代的过程,也就是说,通常先创建设计模型,再用原型实现这个设计模型,并由用户试用和评估,然后根据用户意见进行修改。
为了支持上述迭代过程,各种用于界面设计和原型开发的软件工具应运而生。这些工具被称为用户界面工具箱或用户界面开发系统。
3. 过程设计工具
3.1. 程序流程图
程序流程图又称为程序框图,它是历史最悠久、使用最广泛的描述过程设计的方法。
它的主要优点是对控制流程的描绘很直观,便于初学者掌握。
程序流程图的主要缺点有:
- 程序流程图本质上不是逐步求精的好工具,它诱使程序员过早地考虑程序的控制流程,而不去考虑程序的全局结构;
- 程序流程图中用箭头代表控制流,因此程序员不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制;
- 程序流程图不易表示数据结构。
3.2. 盒图(N-S图)
盒图具有功能域明确的特点,很容易确定局部和全程数据的作用域,能清晰的表现嵌套关系,也可以表示模块的层次结构。不可以任意转移控制。
例如下面的程序流程图,N-S图表示如下。
3.3. PAD图
PAD是问题分析图(problem analysis diagram)的英文缩写,自1973年由日本日立公司发明以后,已得到一定程度的推广,它用二维树形结构的图来表示程序的控制流,将这种图翻译成程序代码比较容易。
它拥有如下优点:
- 使用表示结构化控制结构的PAD符号设计出来的程序必然是结构化程序;
- PAD图所描绘的程序结构十分清晰;
- PAD图表现程序逻辑易读、易懂、易记;
- 容易将PAD图转换成高级语言源程序,这种转换可用软件工具自动完成;
- 即可表示程序逻辑,也可描绘数据结构;
- PAD图的符号支持自顶向下、逐步求精方法的使用。
例如下面的程序流程图,PAD图表示如下。
3.4. 判定表(决策表)
当算法中包含多重嵌套的条件选择时,用程序流程图、盒图、PAD图或后面即将介绍的过程设计语言(PDL)都不易清楚地描述。
判定表却能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。
如上图所示,一张判定表由4部分组成:
- 左上部列出所有条件;
- 左下部是所有可能做的动作;
- 右上部是表示各种条件组合的一个矩阵;
- 右下部是和每种条件组合相对应的动作。
一张典型的判定表如下所示:
1 | 2 | 3 | 4 | ||
---|---|---|---|---|---|
条件 | 发货单金额 | >$500 | >$500 | <=$500 | <=$500 |
赊欠情况 | >60天 | <=60天 | >60天 | <=60天 | |
操作 | 不发出批准书 | √ | |||
发出批准书 | √ | √ | √ | ||
发出发货单 | √ | √ | √ | ||
发出赊欠报告 | √ |
判定表能清晰地表示复杂的条件组合与应做的动作之间的对应关系。但判定表的含义不是一眼就能看出来的,初次接触这种工具的人理解它需要有一个简短的学习过程,当数据元素的值多于两个时,判定表的简洁程度也将下降,此时建议使用判定树。
3.5. 判定树(决策树)
判定树是判定表的一种简化形式,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。因此多年来判定树一直受到人们的重视,是一种比较常用的系统分析和设计的工具。
判定树的形式简单,一眼就可以看出其含义,因此易于掌握和使用。但是它的简洁性不如判定表,数据元素的同一个值往往要重复写多遍,而且越接近树的叶端重复次数越多,并且画判定树时分枝的次序可能对最终画出的判定树的简洁程度有较大影响。
如下判定树示例,用来计算行李费:
3.6. 过程设计语言
过程设计语言(PDL)也称为伪代码,它是用正文形式表示数据和处理过程的设计工具。
PDL具有严格的关键字外部语法,用于定义控制结构和数据结构;另一方面,PDL表示实际操作和条件的内部语法通常又是灵活自由的,可以适应各种工程项目的需要。
PDL是一种“混杂”语言,它使用一种语言的词汇,同时却使用另一种语言的语法。
伪代码的基本控制结构有三种:
- 简单陈述句结构:避免复合语句;
- 判定结构:IF_THEN_ELSE或CASE_OF结构;
- 选择结构:WHILE_DO或REPEAT_UNTIL结构。
例如用伪代码设计检测发货单的过程
IF 发货单金额超过$500 THEN
IF 欠款超过60天 THEN
在偿还欠款前不予批准
ELSE 欠款未超期
发批准书及发货单
ENDIF
ELSE 发货单金额未超过$500
IF 欠款超过60天 THEN
发批准书、发货单及催款通知
ELSE 欠款未超期
发批准书及发货单
ENDIF
ENDIF
PDL可以作为注释直接插在源程序中间。有助于保持文档和程序的一致性,提高了文档的质量。也可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作。现在已经有自动处理程序存在,而且可以自动由PDL生成程序代码,极大方便了工作。但不如图形工具形象直观,描述复杂的条件组合与动作间的对应关系时,不如判定表清晰简单。
4. 面向数据结构的设计方法
4.1. 面向数据结构的设计方法概述
数据结构既影响程序的结构又影响程序的处理过程,最终目标是得出对程序处理过程的描述,一般来说这种设计方法有着以下三条设计准则:
- 重复出现的数据通常由具有循环控制结构的程序来处理;
- 选择数据要用带有分支控制结构的程序来处理;
- 层次的数据组织通常和使用这些数据的程序的层次结构相似。
这里我们介绍一下Jackson结构程序设计方法,它是一种结构化编程方法,以数据流结构及程序结构之间的对应关系为基础。Jackson方法将程序及数据用顺序、选择、循环结构的组合来表示,适合用来设计程序的细部控制结构。
4.2. Jackson图
数据结构中数据元素彼此间的逻辑关系有三种:
- 顺序结构:顺序结构的数据由一个或多个数据元素组成,每个元素按确定次序出现一次;
- 选择结构:选择结构的数据包含两个或多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个;
- 循环结构:重复结构的数据,根据使用时的条件由一个数据元素出现零次或多次构成。
Jackson图形象直观可读性好,便于表示层次结构,而且是对结构进行自顶向下分解的有力工具,它既能表示数据结构也能表示程序结构。但当用Jackson图表示选择或重复结构时,选择条件或循环结束条件不能直接在图上表示出来,影响了图的表达能力,也不易直接把图翻译成程序,另一方面,Jackson图的框间连线为斜线,不易在行式打印机上输出。
4.4. Jackson方法
Jackson结构程序设计方法由5个步骤组成:
- 分析并确定输入数据和输出数据的逻辑结构,用Jackson图描绘数据结构;
- 找出输入数据结构和输出数据结构中有对应关系的数据单元。
所谓有对应关系是指有直接的因果关系,在程序中可以同时处理的数据单元(对于重复出现的数据单元必须重复的次序和次数都相同才可能有对应关系)。 - 用下述规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图:
第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(层次不同时与图中层次低的那个对应);
第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;
第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。
改进的Jackson图规定在构成顺序结构的元素中不能有重复出现或选择出现的元素,因此可能需要增加中间层次的处理框。 - 列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。
- 用伪码表示程序。
例如:假设一个文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。
用 Jackson结构程序设计方法的设计步骤如下:
- 用Jackson图描绘的输入输出数据结构
- 分析确定在输入数据结构和输出数据结构中有对应关系的数据单元
- 从数据结构图导出程序结构图
- 列出所有操作和条件,并且把它们分配到程序结构图的适当位置
- 用伪码表示程序处理过程
5. 程序复杂程度的定量度量
5.1. 程序复杂程度的定量度量概述
详细设计阶段设计出的模块质量可以使用软件设计的基本原理和概念进一步仔细衡量它们的质量。但是,这种衡量毕竟只能是定性的,人们希望能进一步定量度量软件的性质。
定量度量程序复杂程度可以把程序的复杂程度乘以适当常数即可估算出软件中错误的数量以及软件开发需要用的工作量,定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣,也可以作为模块规模的精确限度。
5.2. McCabe方法
McCabe方法是一种软件质量度量方法,它是基于对程序拓扑结构复杂度的分析。 它根据程序控制流的复杂程度定量度量程序的复杂程度,这样度量出的结果称为程序的环形复杂度。
它的表示是一张流图,所谓流图实质上是简化的程序流程图,它仅仅描绘程序的控制流程,完全不表现对数据的具体操作以及分支或循环的具体条件。
流图的表示图符:
- 结点:用圆表示,一个圆代表一条或多条语句;
- 边:箭头线称为边,代表控制流。在流图中一条边必须终止于一个结点,即使这个结点并不代表任何语句;
- 区域:由边和结点围成的面积称为区域,包括图外部未被围起来的区域。
如下图所示:
任何方法表示的过程设计结果,都可以翻译成流图,在流图中,对不同结构有不同的表示方法,例如:
- 对于顺序结构,一个顺序处理序列和下一个选择或循环的开始语句,可以映射成流图中的一个结点
- 对于选择结构,开始语句映射成一个结点;两条分支至少各映射成一个结点;结束映射成一个结点
- 对于循环结构,开始和结束语句各映射成一个结点。
当过程设计中包含复合条件时,应该把复合条件分解为若干个简单条件,每个简单条件对应流图中一个结点。所谓复合条件,就是在条件中包含了一个或多个布尔运算符(逻辑OR,AND,NAND,NOR)。
例如:
计算环形复杂度的方法
环形复杂度定量度量程序内分支数或循环个数,即程序结构的复杂程度,它可以定量地度量测试难度,然后能对软件最终的可靠性给出某种预测。大量实践表明,模块环形复杂度以V(G)≤10为宜。
环形复杂度定量度量程序的逻辑复杂度。有了描绘程序控制流的流图之后,可以用下述3种方法中的任何一种来计算环形复杂度V(G):
- V(G)=流图中的区域数;
- V(G)=E-N+2(其中E是流图中的边数,N是结点数)
- V(G)=P+1(其中P是流图中判定结点的数目 )
例如:
5.3. Halstead方法
Halstead方法根据程序中运算符和操作数的总数来度量程序的复杂程度。
令 N 1 N_1 N1为程序中运算符出现的总次数, N 2 N_2 N2为操作数出现的总次数,程序长度 N N N定义为: N = N 1 + N 2 N=N_1+N_2 N=N1+N2
程序中使用的不同运算符(包括关键字)的个数 n 1 n_1 n1,以及不同操作数(变量和常数)的个数 n 2 n_2 n2。预测程序长度的公式如下: H = n 1 log 2 n 1 + n 2 log 2 n 2 H = n_1 \log_2n_1 + n_2 \log_2n_2 H=n1log2n1+n2log2n2预测程序中包含错误的个数的公式如下: E = N log 2 ( n 1 + n 2 ) / 3000 E = N \log_2 (n_1+n_2) / 3000 E=Nlog2(n1+n2)/3000