《第四章总体设计设计》由会员分享,可在线阅读,更多相关《第四章总体设计设计(68页珍藏版)》请在金锄头文库上搜索。
1、4.1 总体设计的过程,总体设计过程通常由两个主要阶段组成: 1.系统设计,确定系统的具体实现方案; 2.结构设计,确定软件结构。,总体设计的过程: 确定方案 确定结构,一、设想供选择的方案,二、选择合理的方案,三、推荐最佳方案,四、功能分解,五、设计软件结构,六、数据库设计,七、制定测试计划,八、书写文档,九、审查复审,概要设计的任务 1将系统划分成模块; 2确定每个模块的功能; 3确定模块的调用关系; 4确定模块的界面,即模块间传递的数据。,.2 软件设计基本概念,一模块化与信息隐藏(Modularization, Information Hiding),1分解(Decomposition
2、) 设C(x)为问题x的复杂程度,E(x)为解决x 的工作量(时间)。 若 C(p1)C(p2),则E(p1)E(p2) 实践证明: C(p1+p2)C(p1)+C(p2) E(p1+p2)E(p1)+E(p2) 模块化,2信息隐藏,模块内部的数据与过程,应该对不需要了解这些数据与过程的模块隐藏起来,只有为了完成软件的总体功能而必需在模块间交换的信息,才允许在模块间进行传递。,模块独立性 (Module Independence),模块独立的概念是模块化、抽象、信息隐藏和局部化的直接结果。 开发具有独立功能而且和其他模块之间没有过多的相互作用的模块,就可以做到模块独立。 为什么模块独立性很重要
3、呢? 有效的模块化的软件比较容易开发出来; 独立的模块比较容易测试和维护。,(1). 内聚(Cohesion) 内聚标志一个模块内各个元素彼此结合的紧密程度。它是信息隐藏和局部化概念的自然扩展。内聚度越高越好。,. 偶然性内聚(Coincidental Cohesion) 所谓偶然性内聚是指一个模块内各成分为完成一组功能而组合在一起,它们相互之间即使有关系,也很松散。 . 逻辑性内聚(Logical Cohesion) 如果一个模块完成的任务逻辑上相关(例如,一个产生所有与类型无关的输出),则称为逻辑性内聚。 . 时间性内聚 (Temporal Cohesion) 如果一个模块内包含的任务必须
4、在一个时间段内执行(例如一个初始化模块),则称之为时间性内聚。 . 过程性内聚 (Procedural Cohesion) 模块的过程性内聚是指,模块内成分彼此相关,并且必须按特定的次序执行。,5. 通讯性内聚 (Communicational Cohesion) 模块的通讯性内聚是指,模块中各成分都将对数据结构的同一区域进行操作,以达到通讯的目的。 6. 顺序性内聚 (Sequential Cohesion) 如果一个模块内的各处理成分均与同一功能相关,且这些处理必须顺序执行,则称为顺序性内聚。 7. 功能性内聚 (Functional Cohesion) 如果模块内所有成分形成一个整体,完
5、成单个功能,则称为功能内聚。 功能内聚是最高的内聚形式。,(2).耦合(Coupling) 耦合是对一个软件结构内不同模块之间互连程度的度量。耦合度越弱越好。耦合度的强弱取决于模块间接口的复杂性、进入或调用模块的位置以及通过界面传送数据的多少等。,.非直接耦合 (No Direct Coupling) 如果两模块中任一个都不依赖对方能独立工作 ,则称这两模块为非直接耦合,这类耦合度最低。 .数据耦合 (Data Coupling) 如果两模块间通过参数交换信息,而信息仅限于数据,则称这两模块为数据耦合。 .特征耦合 (Stamp Coupling) 介于数据耦合和控制耦合之间的是特征耦合。,4
6、. 控制耦合(Control Coupling) 如果两模块间通过参数交换信息,而信息仅限于数据,此时若传递的信息中包含控制信息,则耦合度上升为控制耦合。 5. 外部耦合 (External Coupling) 当若干模块均与同一个外部环境关联(例如I/O处理使所有模块与特定I/O设备、格式和通讯协议相关联),它们之间便存在外部耦合。 6. 公共耦合 (Common Coupling) 当若干模块通过全局的数据环境相互作用时,它们之间存在公共耦合。,7.内容耦合 (Content Coupling) 最高耦合度是内容耦合,出现内容耦合的情形包括:当一个模块使用另一个模块内部的数据或控制信息;一
7、个模块直接转移到另一模块内部,等。,二抽象与逐步求精,抽象 是一个心理学概念,即将注意力集中在某一层次上考虑问题,而忽略那些低层次的细节,软件工程过程的每一步都是对较高一级抽象的解,作一次较具体的描述 逐步求精 与抽象密切相关,是一种自顶向下设计策略,其主要思想是:针对某个功能的宏观描述用逐步求精的方法不断地分解。逐步确定过程细节直至该功能用程序描述的算法实现为止。这种分解是逐步的,即每一步分解仅较其前一步增加“少量”的细节。这样在相连两步之间只有微小的变化,不难验证它们的内容是否等效。,例:求五边形的面积,边长由L1L7由键盘读入 解:一级抽象(求精) 1.输入长度L1L7; 2. 由L1、
8、L5、L6求三角形面积S1; 3. 由L2、L6、L7求三角形面积S2; 4. 由L3、L4、L6求三角形面积S3; 5. S=S1+S2+S3; 6.输出S; 二级求精:已知三边a、b、c, 求三角形面积Ts P=(a+b+c)/2; Ts=SQRT(P(P-a)(P-b)(P-c) 三级求精:写出程序。,4. 启发式规则,在软件开发的长期时间中人们积累了丰富的经验,总结这些经验得出了一些有用的启发式规则。它能给软件工程师以有用的启示,帮助他们找到改进软件设计提高软件质量的途径。,一改进软件结构提高模块独立性; 设计出软件的初步结构后,应该审查分析这个结构,通过模块分解和合并,力求降低耦合提
9、高内聚。 二模块规模应该适中;(通常为60行语句) 三深度、广度、扇出和扇入都应适中(增加中间层); 深度表示软件结构中控制的层数,能粗略地标志一个系统的大小和复杂程度。 广度是软件结构内同一个层次上的模块总数的最大值。一般来说,广度越大系统越复杂。对广度影响最大的因素是模块的扇出。 扇入(fan-in)是指模块的上级模块数,即共有多少模块需要调用这个模块。 扇出(fan-out)是指模块调用下属模块的数目,或者说这个模块具有多少个下属模块。,四模块的作用域应该在控制域之内 模块的作用域定义为受该模块一个判定影响的所有模块的集合;模块的控制域是这个模块本身以及所有直接或间接从属于它的模块的集合
10、。 如下图:,五力争降低模块接口的复杂程度; 模块接口复杂是软件发生错误的主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。 接口复杂或不一致是紧耦合或低内聚的征兆,应该重新分析这个模块的独立性。 六设计单入口单出口的模块; 这条启发式规则警告软件工程师不要使模块间出现内容耦合。当从顶部进入模块并且从底部退出来时,软件是比较容易理解的,因此也是比较容易维护的。,七模块功能应该可以预测。 模块的功能应该可以预测,但也要防止模块功能过分局限。 如果一个模块可以当作一个黑盒子,也就是说,只要输入数据相同就产生同样的输出,这个模块就是可以预测的。 以上列出的启发式规则多数是经验规律
11、,对改进设计,提高软件质量,往往有重要的参考价值。但是,它们既不是设计的目标也不是设计时应该普遍遵循的原则。,.4 设计文档及其复审,一.总体及详细设计说明书 在设计阶段,设计人员要完成两种文档:概要设计说明书和详细设计说明书。前者确定软件结构(software structure),后者则着重描述程序的过程(program procedure)。,总体设计说明书应包括: )以图表形式表示的软件总体结构; )模块的外部设计,包括关于各模块功能、性能与接口的简要描述; )数据结构设计,包括数据模式、访问方法和存储要求。 详细设计说明书应包括: )表示软件结构的图表; 2)对逐个模块的程序描述,包
12、括算法和逻辑流程、输入输出项与外部接口等。,二设计表达工具 1.层次图和HIPO图,层次图(Hierarchy ChartHC图)表示软件的分层结构。层次图中的一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系。,IPO(输入、加工、输出图),IPO图=HC图+IPO图 用HC图描述软件结构,用IPO图描述程序过程。,2. 结构图,SC图是SD方法在概要设计中使用的主要表达工具,用来显示软件的组成模块及其调用关系。SD方法约定,用矩形框来表示模块,用箭头的连线表示模块间的调用关系。在调用线的两旁,应标出传入和传出模块的数据流。,1).模块的表示符号,2).简单调用
13、,3).选择调用,4).循环调用,三设计复审(Design Review) 概要设计复审应该把重点放在系统的总体结构,模块划分,内外接口等方面。例如软件的结构能否满足需求?结构的形态是否合理,层次是否清晰?模块的划分是不是符合模块化和信息隐藏的思想等优化原则?系统的人机界面、各模块的接口以及出错处理是否恰当?模块的设计能否满足功能与性能要求?选择的算法与数据结构是否合理,能否适应编程语言等? 复审包括软件总体结构、数据结构、界面以及模块过程细节四个方面。,.5 面向数据流的设计方法,面向数据流的设计方法(Data Flow-oriental Design)也称结构设计方法(Structured
14、 DesignSD),是根据需求阶段对数据流的分析(用数据流图和数据字典表示)设计软件结构。,一概念和设计过程 为了有效地实现从DFD图到SD图的映射,SD方法规定了下列五个步骤: 用SD方法将数据流图转换为软件结构,其过程为:,2). 事务流 这种类型至少有一条接受路径(Reception Path); 一个事物中心 (Transaction Center); 与若干条动作路径 (Action Path);,.划定流界; 3. 将数据流图映射为程序结构; 4. 提取层次控制结构; 5.通过设计复审和使用启发式策略进一步精化所得到的结构。(如下图),二变换分析 第一步:复查基本系统模型; 第二
15、步:复查并精化数据流图; 第三步:确定数据流图具有变换特性还是事物特性; 第四步:输入流和输出流的边界,从而孤立变换中心; 第五步:完成“第一级分解”; 第六步:完成“第二级分解”; 第七步:采用启发式设计策略,精华所得程序结构雏形,改良软件质量。,四设计优化,对软件结构的修改越早越好,人们把软件总体结构设计与详细过程设计分开正是为了提供尽早优化结构的可能性。有时,甚至可以并行地开发若干个软件结构,通过评比求得“最佳”结果。 考虑设计优化问题是应该记住,“一个不能工作的最佳设计的价值是值得怀疑的”。软件设计人员应该致力于开发能满足所有功能和性能要求,而且按照设计原理和启发式设计规则衡量是值得接
16、受的条件。 应该在设计的早期阶段尽量对软件结构进行精化。可以导出不同的软件结构,然后对它们进行评价和比较,力求得到“最好”的结果。这种优化的可能,是把软件结构设计和过程设计分开的真正优点之一。,注意,结构简单通常既表示设计风格优雅,又表明效率高。设计优化应该力求做到在有效的模块化的前提下使用少量的模块,以及在能满足信息要求的前提下使用最简单的数据结构。 对于时间是决定性因素的应用场合,可能有必要在详细设计阶段,也可能在编写程序的过程中进行优化。软件开发人员应该认识到,程序中相对说比较小的部分(典型地,),通常占用全部处理时间的大部分()。,用下述方法对时间起决定性作用的软件进行优化是合理的: ()在不考虑时间因素的前提下开发并精化软件结构; ()在详细设计阶段选出最耗费时间的那些模块,仔