本文用书:《软件工程导论》 第六版 清华大学出版社
1、结构程序设计中有哪几种基本控制结构?
2、了解人机界面的设计。
3、掌握过程设计的工具(程序流程图、盒图、PAD图,判定树)
4、面向数据结构的设计方法(Jackson图)
5、程序复杂度的定量度量(McCabe)
第六章 详细设计
6.1 结构程序设计
顺序、选择和循环。
结构程序设计是尽可能少用GO TO语句的程序设计方法。最好仅在检测出错误时才使用GO TO语句,而且应该总是使用前向GO TO语句。
6.2人机界面设计
1.设计问题
(1)系统响应时间:长度和易变性;
(2)用户帮助设施:集成和附加;
(3)出错信息处理;
(4)命令交互。
2.设计过程
(1)系统及其界面的规格说明书的长度和复杂程度,预示了用户学习使用该系统所需要的工作量。
(2)命令或动作的数量、命令的平均参数个数或动作中单个操作的个数,预示了系统的交互时间和总体效率。
(3)设计模型中包含的动作、命令和系统状态的数量,预示了用户学习使用该系统时需要记忆的内容的多少。
(4)界面风格、帮助设施和出错处理协议,预示了界面的复杂程度及用户接受该界面的程度。
3.人机界面设计指南
(1)一般交互指南;
(2)信息显示指南;
(3)数据输入指南。
6.3 过程设计的工具
1.程序流程图
(1)优点:对程序的控制流程描述直观、清晰,使用灵活,便于阅读和掌握。
(2)缺点:
<1> 程序流程图中可以随心所欲地使用流程线,容易造成程序控制结构的混乱,与结构化程序设计的思想相违背。
<2>程序流程图难以描述逐步求精的过程,容易导致程序员过早考虑程序的控制流程,而忽略程序全局结构的设计。
<3>程序流程图难以表示系统中的数据结构。
2.盒图(N-S图)
(1)优点:表达出的程序结构必然符合结构化程序设计的思想,有利于培养软件设计人员的良好设计风格。
(2)缺点:当所描述的程序嵌套层次较多时,N-S图的内层方框会越画越小,不仅影响可读性而且不易修改。
3.PAD图
(1)优点:
(1) 使用PAD图描述的程序结构层次清晰,逻辑结构关系直观、易读、易记、易修改。
(2) PAD图为多种常用高级语言提供了相应的图形符号, 每种控制语句都与一个专门的图形符号相对应,易于PAD图向高级语言源程序转换。
(3) 支持自顶向下、逐步求精的设计过程。
(4) 既能够描述程序的逻辑结构,又能够描述系统中的数据结构。
4.判定表
例:一图书销售系统,其中一加工为“优惠处理”,条件是:顾客的营业额大于1000元,同时必须信誉好,或者虽然信誉不好,但是20年以上的老主顾。
(1)缺点:虽然能清晰地表示复杂的条件组合与应做的动作之间的对应关系,但其含义却不是一眼就能看出来的,初次接触这种工具的人理解它需要有一个简短的学习过程。此外,当数据元素的值多于两个时(例如,6.3.4例子中假设对机票需细分为头等舱、二等舱和经济舱等多种级别时),判定表的简洁程度也将下降。 判定
5.判定树
(1)优点:形式简单到不需任何说明,一眼就可以看出其含义,因此易于掌握和使用。
6.过程设计语言(PDL):一种用于描述程序算法和定义数据结构的伪代码。
(1)主要特点:
(1) 各种定义语句及控制结构的表达都具有严格的语法形式,使程序结构、数据说明等更加清晰。
(2) 提供了数据说明机制,可用于定义简单及复杂的数据结构。
(3) 提供了模块的定义和调用机制,方便了程序模块化的表达。
6.4 面向数据结构的设计方法
1.Jackson图
改进后的Jackson图:
1.优点
(1)便于表示层次结构,而且是对结构进行自顶向下分解的有力工具;
(2)形象直观可读性好;
(3)既能表示数据结构也能表示程序结构.
2.Jackson方法
例:一个正文文件由若干个记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。
(1) 分析并确定输入数据和输出数据的逻辑结构,并用Jackson图描绘这些数据结构。(左输入右输出)
(2) 找出输入数据结构和输出数据结构中有对应关系的数据单元。所谓有对应关系是指有直接的因果关系,在程序中可以同时处理的数据单元(对于重复出现的数据单元必须重复的次序和次数都相同才可能有对应关系)。(虚线表示找出的有对应关系的数据单元)
(3) 用下述3条规则从描绘数据结构的Jackson图导出描绘程序结构的Jackson图:
<1>为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框(注意,如果这对数据单元在输入数据结构和输出数据结构中所处的层次不同,则和它们对应的处理框在程序结构图中所处的层次与它们之中在数据结构图中层次低的那个对应);
<2>根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框;
<3>根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。
(4) 列出所有操作和条件(包括分支条件和循环结束条件),并且把它们分配到程序结构图的适当位置。
(5) 用伪码表示程序。
统计空格seq
打开文件
读入字符串
totalsum∶=0
程序体iter until文件结束
处理字符串seq
印字符串seq
印出字符串
印字符串end
sum∶=0
pointer∶=1
分析字符串iter until字符串结束
分析字符select字符是空格
处理空格seq
sum∶=sum+1
pointer∶=pointer+1
处理空格end
分析字符or字符不是空格
处理非空格seq
pointer∶=pointer+1
处理非空格end
分析字符end
分析字符串end
印空格数seq
印出空格数目
印空格数end
totalsum∶=totalsum+sum
读入字符串
处理字符串end
程序体end
印总数seq
印出空格总数
印总数end
关闭文件
停止
统计空格end
6.5 程序复杂程度的定量度量
1.McCabe方法
(1)映射方法
(2) 环形复杂度的计算:
(1) 流图中的区域数等于环形复杂度。
(2) 流图G的环形复杂度V(G)=E-N+2,其中,E是流图中边的条数,N是结点数。
(3) 流图G的环形复杂度V(G)=P+1,其中,P是流图中判定结点的数目。
(3)程序的环形复杂度取决于程序控制流的复杂程度,也即是取决于程序结构的复杂程度。当程序内分支数或循环个数增加时,环形复杂度也随之增加,因此它是对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。 McCabe研究大量程序后发现,环形复杂度高的程序往往是最困难、最容易出问题的程序。实践表明,模块规模以V(G)≤10为宜,也就是说,V(G)=10是模块规模的一个更科学更精确的上限。
(4)例子
做题步骤:
<1>做出程序流程图;
<2>根据程序流程图映射出流图;
<3>根据流图计算环形复杂度。
2.Halstead方法(略)
令N1为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N定义为:N=N1+N2
详细设计完成之后,可以知道程序中使用的不同运算符(包括关键字)的个数n1,以及不同操作数(变量和常数)的个数n2。Halstead给出预测程序长度的公式如下:H=n1 log2 n1+n2 log2 n2
多次验证都表明,预测的长度H与实际长度N非常接近。
Halstead还给出了预测程序中包含错误的个数的公式如下:E=N log2 (n1+n2)/3000
有人曾对从300条到12000条语句范围内的程序核实了上述公式,发现预测的错误数与实际错误数相比误差在8%之内。