1、设计复查,采用概要设计复查的方法来检查在概念上的设计; 在关键设计审查中,向其它开发者描述关键技术上的设计细节; 进行程序设计的复查,程序设计的复查属于详细设计阶段。复查的目标是确保软件设计与实现正是用户想要的。,重点,概要设计复审应该把重点放在系统的总体结构、模块划分、内外接口等方面。例如软件的结构能否满足需求?结构的形态是否合理?层次是否清晰?模块的划分是不是符合优化的原则?系统的人机界面、内外部接口,以及出错处理是不是合理等。 关键设计过复审的重点应该放在各个模块的具体设计上。例如模块的设计能否满足其功能与性能要求?选择的算法与数据结构是否合理,符不符合编码语言的特点?设计描述是否简单、
2、清晰等。,5.9 数据设计,数据结构是影响软件质量的重要因素。 数据结构设计合理,往往能够获得很好的软件结构,使软件具有很强的模块独立性、易理解性和易维护性。,5.9.1 数据设计的原则,数据设计是为在需求分析阶段所确定的数据对象定义逻辑数据结构,需要对不同结构进行算法分析,以便选择一个最有效的设计方案 , 确定对逻辑数据结构所必需的那些操作的程序模块(软件包),以便限制或确定各个数据设计决策的影响范围。,(1)用于软件的系统化方法也适用于数据。在导出、评审和定义软件的需求和软件系统结构时,必须定义和评审其中所用到的数据流、数据对象及数据结构的表示。应当考虑几种不同的数据组织方案,还应当分析数
3、据设计给软件设计带来的影响。 (2)要确定所有的数据结构和在每种数据结构上施加的操作。设计有效的数据结构,必须考虑到要对该数据结构进行的各种操作。如果定义了一个由多个不同类型的数据元素组成的复杂数据结构,它会涉及到软件中若干个功能的实现处理。在考虑对这种数据结构进行的操作时,可以为它定义一个抽象数据类型,以便在今后的软件设计中使用它。抽象数据类型的规格说明可以大大简化软件设计。,(3)应当建立一个数据词典并用它来定义数据和软件的设计。数据词典清楚地说明了各个数据之间的关系和对数据结构内各个数据元素的约束。如果有一个类似于数据词典的数据规格说明,一些必须涉及到数据之间某种具体关系的算法就很容易确
4、定。 (4)低层数据设计的决策应推迟到设计过程的后期进行。可以将逐步细化的方法用于数据设计。在进行需求分析时确定的总体数据组织,应在概要设计阶段加以细化,而在详细设计阶段才规定具体的细节。这种自顶向下进行数据设计的方法首先设计和分析主要的结构特性,具有与自顶向下进行软件设计的方法相类似的优点。,(5)数据结构的表示只限于那些必须直接使用该数据结构内数据的模块才能知道。此原则就是信息隐蔽和与此相关的耦合性原则。并把数据对象的逻辑表示与物理表示分开。 (6)应当建立一个存放有效数据结构及相关操作的库。数据结构和它的相关操作可以看做是软件设计的资源。数据结构应当设计成为可复用的。建立一个存有各种可复
5、用的数据结构模型的部件库,可以减少数据的规格说明和设计两方面的工作量。 (7)软件设计和程序设计语言应当支持抽象数据类型的定义和实现。如果没有直接定义某种复杂数据结构的手段,这种结构的设计和实现往往是很困难的。,以上原则可适用于软件工程的定义阶段和开发阶段。 要记住一句话:“清晰的信息定义是软件开发成功的关键”,5.9.2 数据结构设计,1)尽量使用简单的数据结构。简单的数据结构通常伴随着简单的操作,有些人喜欢使用复杂的工具完成一些简单的事情,这在软件开发中是比较忌讳的。 2) 在设计数据结构时要注意数据之间的关系,特别要平衡数据冗余与数据关联的矛盾。有时,为了减少信息的冗余,需要增加更多的关
6、联,使程序处理比较复杂;如果一味的降低数据之间的关联,可能会造成大量的数据冗余,难以保证数据的一致性。,3) 为了加强数据设计的可复用性,应该针对常用的数据结构和复杂的数据结构设计抽象类型,并且将数据结构与操纵数据结构的操作封装在一起。同时要清楚地描述调用这个抽象数据结构的接口说明。 4) 尽量使用经典的数据结构,因为,对它们的讨论比较普遍,容易被大多数开发人员理解,同时,也能够获得更多的支持。 5)在确定数据结构时一般先考虑静态结构,如果不能满足要求,再考虑动态结构。,5.9.3 文件设计,是指对数据存储文件的设计,主要工作是根据使用要求、处理方式、存储的信息量、数据的使用频率和文件的物理介
7、质等因素,来确定文件的类别、文件的组织方式。设计文件记录的格式,估计文件的容量。 文件的设计过程包括文件的逻辑设计和文件的物理设计两个阶段,文件的逻辑设计在概要设计阶段进行,文件的物理设计在详细设计阶段进行。,文件逻辑设计的任务:,1) 整理必须的数据元素:分析文件中要存储的数据元素,确定每个数据元素的类型、长度,并且给每个数据元素定义一个容易理解的、有意义的名字。 2) 分析数据间的关系:根据业务处理逻辑确定数据元素之间的关系,有时一个文件记录中可能包含多个子数据结构。例如,考生成绩文件的记录中可能包含:考生编号、姓名、学校、(语文、数学、英语、物理、化学)、总成绩。其中,括号部分是一个子结
8、构,描述各科的成绩,这些数据元素可能需要同时处理。,3) 确定文件的存储介质。目前,文件的存储介质主要有磁带、软盘、磁盘、光盘、可移动快速闪存。选择文件存储介质是主要考虑下面一些原则: a) 数据量 b) 处理方式 c) 存储时间 d) 处理时间 e) 数据结构 f) 操作要求 g) 费用要求,4) 确定文件的记录格式。文件的记录格式通常分为无格式的字符流和用户定义的记录格式两种。并且还可以设计为定长记录和不定长记录。 5) 估算记录的存取时间。根据文件的存储介质和类型,计算平均访问时间和最坏情况下的访问时间。 6)估算文件的存储量。根据一条记录的大小估算整个文件的存储量,然后,考虑文件的增长
9、速度,确定文件的存储介质的规格型号,以及设计文件备份转储的周期,5.9.4 数据库设计,数据库设计通常包括下述: ()模式设计:模式设计的目的是确定物理数据库结构。第三范式形式的实体及关系数据模型是模式设计过程的输入,模式设计的主要问题是处理具体的数据库管理系统的结构约束。 ()子模式设计:子模式是用户使用的数据视图。 ()完整性和安全性设计 ()优化,5.10 接口设计,软件概要设计提供的是软件的整体构架,就像房子的设计蓝图一样,如果不画出门、窗、水管、电线和电话线的布局,整个设计就不完整。对于软件结构设计来说,这些“门、窗和布线”就构成了软件的接口,在概要设计中的软件接口设计主要包括三个方
10、面: 软件模块间的接口设计; 模块与其他外部实体的接口设计; 用户界面设计。,5.10.1 模块间的接口设计,5.10.2 模块的外部接口设计,5.11详细设计,详细设计的主要任务是设计每个模块的实现算法、所需的局部数据结构。详细设计的目标有两个:实现模块功能的算法要逻辑上正确和算法描述要简明易懂。传统软件开发方法的详细设计主要是用结构化程序设计法。详细设计的表示工具有图形工具和语言工具。图形工具有程序流程图、PAD(Problem Analysis Diagram)图、NS(由 Nassi和 Shneidermen开发,简称 NS)图。语言工具有伪码和 PDL(Program Design
11、Language)等。,主要任务,1为每个模块确定采用的算法,选择某种适当的工具表达算法的过程,写出模块的详细过程性描述; 2确定每一模块使用的数据结构;3确定模块接口的细节,包括对系统外部的接口和用户界面,对系统内部其它模块的接口,以及模块输入数据、输出数据及局部数据的全部细节。 在详细设计结束时,应该把上述结果写入详细设计说明书,并且通过复审形成正式文档。交付给下一阶段(编码阶段)的工作依据。4要为每一个模块设计出一组测试用例,以便在编码阶段对模块代码(即程序)进行预定的测试,模块的测试用例是软件测试计划的重要组成部分,通常应包括输入数据,期望输出等内容。,5.11.1 结构化程序设计,结
12、构化程序设计的核心内容包括: 1) 程序模块只有一个入口和一个出口。 2) 程序中只包含顺序、条件和循环三种控制结构。 3) 采用自顶向下逐步求精的设计方法。详细设计阶段采用自顶向下逐步求精的方法,可以把一个模块的功能逐步分解细化为一系列具体的处理步骤。,(1) 自顶向下,逐步求精方法符合人们解决复杂问题的普遍规律。可提高软件开发的成功率和生产率; (2) 用先全局后局部,先整体后细节,先抽象后具体的逐步求精的过程开发出来的程序具有清晰的层次结构,因此程序容易阅读和理解;,程序清晰和模块化,使得在修改和重新设计一个软件时,可复用的代码量最大; 每一步工作仅在上层结点的基础上做不多的设计扩展,便
13、于检查; 有利于设计的分工和组织工作。,采用结构化程序设计方法,程序结构清晰,易于阅读、测试、排错和修改。由于每个模块执行单一功能,模块间联系较少,使程序编制比过去更简单,程序更可靠,而且增加了可维护性,每个模块可以独立编制、测试。*,5.11.2 程序流程图,程序流程图是人们对解决问题的方法、思路或算法的一种描述。 主要元素: 方框表示一个处理步骤; 菱形框:表示一个逻辑条件; 箭头表示控制流向,5.11.3 盒状图(N-S),由Nassi和Shneiderman开发了另一种图形化设计工具,它的目标是保证结构化程序设计,这种图形工具叫做盒状图,或称为NS图。,它有以下特点:,(1)功能域(即
14、一个特定控制结构的作用域)明确,很容易从盒图上看出。 (2)不可能任意转移控制 (3)很容易确定局部和全程数据的作用域 (4)很容易表现嵌套关系,也可以表示模块的层次结构 (5)盒图没有箭头,不可以随意转移控制,不允许违背程序设计的原则。,在NS 图中,每个“处理步骤”是用一个盒子表示的,所谓“处理步骤”可以是语句或语句序列。 需要时,盒子中还可以嵌套另一个盒子,嵌套深度一般没有限制,只要整张图在一页纸上能容纳得下,由于只能从上边进入盒子然后从下边走出,除此之外没有其他的入口和出口,所以,NS图限制了随意的控制转移,保证了程序的良好结构。,NS图的优点: 首先,它强制设计人员按SP方法进行思考
15、并描述他的设计方案,因为除了表示几种标准结构的符号之处,它不再提供其他描述手段,这就有效地保证了设计的质量,从而也保证了程序的质量;第二,NS图形象直观,具有良好的可见度。例如循环的范围、条件语句的范围都是一目了然的,所以容易理解设计意图,为编程、复查、选择测试用例、维护都带来了方便;第三,NS图简单、易学易用,可用于软件教育和其他方面。 NS图的缺点:手工修改比较麻烦,这是有些人不用它的主要原因。,5.11.4 PAD图,PAD图是问题分析图(Problem Analysis Diagram)的英文缩写,自1973年由日本日立公司发明之后,得到一定程度的推广。它是用二维树形结构图来表示程序的
16、控制流,将这中图翻译成程序代码比较容易。,主要特点: (1)使用PAD图设计的程序必然是结构化程序 (2)PAD图描绘的程序结构十分清晰。 (3)用PAD图表现程序逻辑,易读、易懂、易记。 (4)容易将PAD图转换成高级语言源程序 (5)PAD图既可用于表示程序逻辑,也可用于描绘数据结构。 (6)PAD图的符号支持自顶向下、逐步求精方法的使用。 (7)PAD图面向高级语言。,5.11.5 表格设计符号,当模块中包含复杂的条件组合,并要根据这些条件的组合选择动作时,只有判定表和判定树能够清晰地表达出复杂的条件组合与各种动作之间的对应关系。,判定表由四部分组成,左上部列出所有条件; 左下部列出所有
17、可能的动作; 右上部所有可能的条件组合(矩阵); 右下部条件组合与动作之间的对应关系。判定表的每一列可解释为一条处理规则,判定表,判定表由四个部分组成,左上部列出了所有的条件,左下部列出了所有可能的动作,右半部构成了一个矩阵,表示条件的组合以及特定条件组合下应执行的操作。,判定树,是判定表的变种,也能清晰地表示复杂的条件组合与应做的动作之间的对应关系。 判定树的优点:形式简单,直观明了,易于掌握。 判定树的缺点:存在着数据冗余的问题,相同的数据元素往往要重复多次,而且越接近树的叶端重复的次数越多。判定树要求对条件进行层次划分,若条件所处层次不对,可能会导致增加判定树的复杂性。,合并后的判定表,
18、5.11.6过程设计语言(PDL),过程设计语言(PDL)也称为结构化的英语或伪码,它是一种混合语言,通常采用英语(或中文)的词汇,采用某种结构化程序设计语言的语法。,1 PDL语言的特点,(1)关键字采用固定语法并支持结构化构件、数据说明机制和模块化; (2)处理部分采用自然语言描述; (3)可以说明简单和复杂的数据结构; (4)子程序的定义与调用规则不受具体接口方式的影响。,2 PDL描述选择结构,declare as procedure interface return end begin end ,5.11.7 模块开发文件夹,随着详细设计过程的进行,每个软件模块相关的文档资料的数量也不断增长。模块开发文件夹是组织和保存在软件开发过程中不断产生出来的文档资料的一种有效方法,用这种方法保存和管理文档既方便又容易查阅。 每个开发文件夹中包含一个或多个模块的全部文档,文件夹的封皮上列出工程项目的名称、模块名字、程序员名字,完成的日期、修改的日期,源程序行数,目标代码长度、对模块的简要描述。以及设计、编码、单元测试和集成测试等阶段的起止时间,5.12 设计规格说明书,设计阶段的主要文当是: 概要设计说明书、详细设计说明书,