《《详细设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《详细设计》PPT课件.ppt(50页珍藏版)》请在三一办公上搜索。
1、第五章 详细设计,详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统。详细设计的结果基本上决定了最终的程序代码的质量。,5.1 结构程序设计,早在1965年,E.W.Dijkstra就提出结构程序设计的概念。1966年,Bohm和Jacopini证明了只用三种基本的控制结构就能实现任何单人口单出口的程序。这三种基本的控制结构是“顺序”、“选择”和“循环”。,上图中的(a)、(b)和(c)就分别是顺序、选择和循环的流程图。,什么是结构程序设计呢?结构程序设计是一个设计程序的技术,它采用自顶向下逐步求精的设计方法和单入口单出口的控制结构。有人认为结构程序设计的定义中还应包括采用“主程序员组
2、”这种人员组织形式。使用结构程序设计也存在一些好处和一些缺点。,从理论上说只用那三种基本控制结构就可以实现任何单入口单出口的程序。但是为了实际使用方便,还常常允许使用DO-UNTIL和DO-CASE两种控制结构。它们的流程图如上图所示。,5.2 详细设计的工具,描述程序处理过程的工具称为详细设计的工具,它们可以分为图形、表格和语言三类。不论是哪类工具,对它们的基本要求都是能提供对设计的无歧义的描述,也就是应该能指明控制流程、处理功能、数据组织以及其他方面的实现细节,从而在编码阶段能把对设计的描述直接翻译成程序代码。,5.2.1 程序流程图,程序流程图又称为程序框图,它是历史最悠久使用最广泛的描
3、述软件设计的方法。它使用了一些系统流程图中没有的符号。如下图所示:,程序流程图一直是软件设计的主要工具。它的主要优点是:对控制流程的描绘很直观,便于初学者掌握。它的主要缺点是:1.程序流程图本质上不是逐步求精的好工具。它诱使程序员过早的考虑程序的控制流,而不去考虑程序的全局结构。2.程序流程图中用箭头代表控制流,因此程序员可以不受任何约束,可以完全不顾结构程序设计的精神,随意转移控制。3.程序流程图不易表示数据结构。,5.2.2 盒图(N_S图),这种盒图是不允许违背结构程序设计精神的图形工具。它有下述特点:1.功能域明确,可以从盒图上看出来。2.不可能任意转移控制。3.很容易确定局部和全程数
4、据的作用域。4.很容易表现嵌套关系,也可以表示模块的层次结构。,上图给出了结构化控制结构和调用子程序的盒图表示方法。,5.2.3 PAD图,PAD是问题分析图(Problem Analysis Diagram)的英文缩写。它用二维树形结构的图来表示程序的控制流。下图给出了PAD图的基本符号:,其中:(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)使用表示结构化控制结构的P
5、AD符号所设计出来的程序必然是结构化程序。(2)PAD图所描绘的程序结构十分清晰。上图最左边的竖线是程序的主线,PAD图中竖线的总条数就是程序的层次数。(3)用PAD图表现程序逻辑,易读,易懂,易记。(4)容易将PAD图转换成高级语言源程序。(5)即可用于表示程序逻辑,也可用于描绘数据结构。(6)PAD图的符号支持自顶向下、逐步求精方法的使用。,使用PAD图,开始时设计者可以定义一个抽象的程序,随着设计工作的深入而使用def符号逐步增加细节,直到完成详细设计,如下图所示:,5.2.4 判定表,判定表能够清晰地表示复杂的条件组合与应做的动作之间的对应关系。一张判定表由四部分组成:左上部列出所有条
6、件。左下部是所有可能做的动作。右上部是表示各种条件组合的一个矩阵。右下部是和每种条件组合相对应的动作。判定表右半部的每一列实质上是一条规则,规定了与特定的条件组合相对应的动作。,下面以行李托运费的算法为例说明判定表的组织方式。假设某航空公司规定,乘客可以免费托运重量不超过30公斤的行李。当行李重量超过30公斤时,对头等舱的国内乘客超重部分每公斤收费4元,对其他舱的国内乘客超重部分每公斤收费6元,对国外乘客超重部分每公斤收费比国内乘客多一倍,对残疾乘客超重部分每公斤比正常乘客少一半。用判定表可以清楚的表示与上述每种条件组合相对应的动作(算法),如下页图所示:其中“T”表示条件成立,“F”表示条件
7、不成立,空白表示这个条件的成立与否并不影响对动作的选择。画“”表示做它左边的那项动作,空白表示不做这项动作。,5.2.5 判定树,判定树是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系,是一种比较常用的系统分析和设计工具。与上表判定表对应的判定树如下:,5.2.6 过程设计语言(PDL),PDL也称为伪码,它是用正文形式表示数据和处理过程的设计工具。PDL具有严格的关键字外部语法,用于定义控制结构和数据结构,然而,PDL表示实际操作和条件的内部语法通常又是灵活自由的,以便可以适应各种工程项目的需要,它使用一种语言的词汇,却使用另一种语言的语法。它具有以下特点:1.关键字的
8、固定语法,它提供了结构化控制结构、数据说明和模块化的特点。2.自然语言的自由语法,它描述处理特点。,3.数据说明的手段既包括简单的数据结构,又包括复杂的数据结构。4.模块定义和调用的技术,应该提供各种接口描述模式。PDL作为一种设计工具还有如下一些优点:1.可以作为注释直接插在源程序中间。2.可以使用普通的正文编辑程序或文字处理系统,很方便地完成PDL的书写和编辑工作。3.已经有自动处理程序存在,而且可以自动由PDL生成程序代码。,5.2.7 模块开发文件夹,模块开发文件夹是组织和保存在软件开发过程种不断产生出来的文档资料的一种有效方法,用这种方法保存和管理文档既方便又容易查阅。文件夹的封面上
9、列出工程项目的名称、模块名字、程序员姓名、完成日期、修改日期、源程序行数、目标代码长度、对模块的简要描述、以及设计、编码、单元测试和集成测试等阶段的起止时间等等。文件夹内应该保存对模块详细设计结果的描述、源程序清单、测试时间、修改的源程序清单、最终的源程序清单、测试方案、测试软件和测试结果等等。,5.3 Jackson程序设计方法,Jackson程序设计方法是面向数据结构的设计方法,也就是用数据结构作为程序设计的基础。它的最终目的是得出对程序处理过程的描述,因此,这种方法最适合于在详细设计阶段使用,也就是在完成了软件结构设计之后,可以使用面向数据结构的方法来设计每个模块的处理过程。,5.3.1
10、 Jackson图,它的逻辑数据结构只有三种:顺序、选择和重复。顺序结构:它的数据由一个或多个数据元素组成,每个元素按确定次序出现一次。结构图如下图所示:,选择结构:它的数据包括两个或多个数据元素,每次使用这个数据时按一定条件从这些数据元素中选择一个。下图所示的是三个中选一个结构的Jackson图:,重复结构:它的数据,根据使用时的条件由一个数据元素出现零次或多次构成。下图表示重复结构的Jackson图:,Jackson图有下述优点:便于表示层次结构,而且是对结构进行自顶向下分解的有力工具。形象直观可读性好。既能表示数据结构也能表示程序结构。,5.3.2 改进的Jackson图,上面介绍的Ja
11、ckson图的缺点是,用这种图形工具表示选择或重复结构时,选择条件或循环结束条件不能直接在图上表示出来,影响了图的表达能力,也不易直接把图翻译成程序,此外,框间连线为斜线,不易在行式打印机上输出。为了解决上述问题,建议使用改进的Jackson图。如下页图所示:,5.3.3 Jackson方法,Jackson结构程序设计方法基本上由下述五个步骤组成:1.分析并确认输入数据和输出数据的逻辑结构,并用Jackson图描述这些数据结构。2.找出输入数据结构和输出数据结构中有对应关系的数据单元。3.从描述数据结构的Jackson图导出描绘程序结构的Jackson图。4.列出所有操作和条件,并且把它们分配
12、到程序结构图的适当位置。5.用伪代码表示程序。,其中第三条需要根据下列规则:第一,为每对有对应关系的数据单元,按照它们在数据结构图中的层次在程序结构图的相应层次画一个处理框。第二,根据输入数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。第三,根据输出数据结构中剩余的每个数据单元所处的层次,在程序结构图的相应层次分别为它们画上对应的处理框。,Jackson方法中使用的伪码和Jackson图是完全对应的,下面是和三种基本结构对应的伪码。和图5.11(a)所示的顺序结构对应的伪码:其中seq和end是关键字。A seq B C D A end,和图5.11(
13、b)所示的选择结构对应的伪码,其中select、or和end示关键字,cond1、cond2和cond3分别是执行B、C和D的条件:A select cond1 B A or cond2 C A or cond3 D A end,和图5.11(d)所示重复结构对应的伪码,其中iter、until、while和end是关键字(重复结构有until和while两种形式),cond是条件:A iter until(或while)cond B A end,举例:,一个正文文件由若干记录组成,每个记录是一个字符串。要求统计每个记录中空格字符的个数,以及文件中空格字符的总个数。要求的输出数据格式是,每复制
14、一行输入字符串之后,另起一行印出这个字符串中的空格数,最后印出文件中空格的总个数。解析:对于这个简单的例子而言。第一步:确定输入和输出数据的结构。下图是用Jackson图描绘的输入/输出数据结构。,第二步:在确定了输入/输出数据结构之后,下一步是分析确定在输入数据结构和输出数据结构中由有对应关系的数据单元。第三步:从数据结构中导出程序结构图。如下:,第四步:列出所有操作和条件,并且把它们分配到程序结构图的适当位置。首先,列出统计空格个数需要的全部操作和条件如下:(1)停止(2)打开文件(3)关闭文件(4)印出字符串(5)印出空格数目(6)印出空格总数(7)sum:=sum+1(8)totals
15、um:=totalsum+sum(9)读入字符串(10)sum:=0(11)totalsum:=0(12)pointer:=1(13)pointer:=pointer+1 I(1)文件结束 I(2)字符串结束 S(3)字符是空格 其中,sum是保存空格个数的变量,totalsum是保存空格总数的变量,pionter是指示当前分析的字符的在字符串中的位置的变量。得到如下图形:,第五步:用伪码表示程序处理过程。从图5.14可以得出下列代码:,统计空格 seq 打开文件 读入字符串 totalsum:=0 程序体 iter until文件结束 处理字符串 seq 印字符串 seq 印出字符串 印出字
16、符串 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,5
17、.5 程序复杂程度的定量度量,定量度量程序复杂程度的方法很有价值:把程序的复杂程度乘以适当常数即可估算出软件中故障的数量以及软件开发需要用的工作量,定量度量的结果可以用来比较两个不同的设计或两个不同算法的优劣;程序的定量的复杂程度可以作为模块规模的精确限度。这里着重介绍使用比较广泛的McCabe方法和Halstead方法。,5.5.1 McCabe方法,使用McCabe方法首先需要画出程序图。所谓程序图可以看成是“退化了的”程序流程图,也就是把程序程序流程图中每个处理符号都退化成一个点,原来连接不同处理符号的箭头变成连接不同点的有向弧,这样的有向图就称为程序图。用McCabe方法度量得出的结果
18、称为程序的环形复杂度,它等于强连通的程序图中线性无关的有向环的个数。通常称程序图中开始点后面的那个节点为入口点,称停止点前面的那个节点为出口点。从程序流程图导出程序图如下页所示:,1.环形复杂度的计算方法,根据图论,在一个强连通的有向图中线形无关环的个数由下面的公式给出:V(G)=m-n+p 其中V(G)是有向图G中的环数,m是有向图G中的弧数;n 是有向图G中的节点数;p 是有向图G中分离部分的数目。对于一个正常的程序来说,应该能够从程序图内的入口点到达图中任何一个节点,因此,程序图总是连通的,也就是说,p=1。,强连通图是指从图中任一个节点出发都可以到达所有其他节点。程序图通常不是强连通的
19、,因为从图中较低的(即较靠近出口点的)节点往往不能到达较高的节点。然而,如果从出口到入口点画一条虚弧,则程序图必然成为强连通的。做出这个结论有下述三点理由:(1)从入口点总能到达图中任何一点;(2)从图中任何一点总能到达出口点;(3)经过从出口点到入口点的弧,可以从出口点到达入口点。,图5.24(b)不是强连通的,必须增加一条从出口点j到入口点b的虚弧,结果如下图所示:,2.环形复杂度的用途,程序的环形复杂度取决于程序控制流的复杂程度,也即是取决于程序结构的复杂程度。当程序内分支或循环个数增加时,环形复杂度也随之增加,因此它是对测试难度的一种定量度量,也能对软件最终的可靠性给出某种预测。McC
20、abe研究大量程序后发现,环形复杂度高的程序往往是最困难、最容易出问题的程序。实验表明,模块规模以V(G)10为宜,也就是说,V(G)=10是规模的一个更科学更精确的上限。,5.5.2 Halstead方法,Halstead方法是另一个著名的方法,它是根据程序运算中运算符和操作符的总数来度量程序的复杂程度。令N1为程序中运算符出现的总次数,N2为操作数出现的总次数,程序长度N定义为:N=N1+N2,详细设计完成之后,可以知道程序中使用的不同运算符(包括关键字)的个数n1,以及不同操作数(变量和常数)的个数n2。Halstead给出预测程序长度的公式如下:H=n1 log2 n1+n2 log2
21、 n2 多次实验都证明,预测的长度H与实际长度N非常接近。Halstead还给出了预测程序中包含错误的个数的公式如下:E=N log2(n1+n2)/3000,5.6 小 结,详细设计阶段的关键任务是确定怎样具体地实现所要求的目标系统,也就是要设计出程序的“蓝图”。除了应该保证的可靠性之外,使将来编写出的程序可读性好,容易理解,容易测试和容易修改、维护使详细设计阶段最重要的目标。理论研究和大量实践都表明,采用自顶向下逐步求精的策略和单入口单出口的控制结构设计程序是完全可行的,而且有一系列重大优点,因此,结构程序设计技术是实现上述目标的基本保证,是进行详细设计的逻辑基础。,程序流程图、盒图、PAD图、HIPO图、判定表、判定树和PDL语言等等都是完成详细设计的工具,选择合适的工具并且正确地使用它们是十分重要的。用模块开发文件夹的形式组织管理与一个模块有关的全部文档,可能是一个行之有效的好方法。面向数据结构的设计方法(例如Jackson方法和Warnier方法)是进行详细设计的形式化的方法。本章的目的仅仅是使读者对这类方法有初步了解,为了能熟练地使用这种方法解决实际问题,还需要进一步钻研有关的专著并进行达来大量的实践。使用环形复杂度可以定量度量程序的复杂程度,实践表明环形复杂度V(G)=10是模块规模的合理上限。,