《软件工程5.总体设计教程》由会员分享,可在线阅读,更多相关《软件工程5.总体设计教程(31页珍藏版)》请在金锄头文库上搜索。
1、1,第五章 总体设计,设计过程 设计原理 启发规则 描绘软件结构的图形工具 面向数据流的设计方法,2,5.1 设计过程,系统设计阶段:确定系统的具体实现方案 结构设计阶段:确定软件结构,3,典型的总体设计过程(一),1. 设想供选择的方案 综合考虑各种可能的实现方案,并且力求从中选出最佳方案。 需求分析阶段得到的数据流图是极好的出发点。 2. 选取合理的方案 参考需求分析阶段确定的工程规模和目标,从可选方案中选择若干个合理的方案,通常至少选择低成本、中等成本、高成本三种方案。 对于每种方案应准备:系统流程图、组成系统的物理元素清单、成本/效益分析、实现系统的进度计划。 3. 推荐最佳方案 综合
2、分析、对比各种合理方案的利弊,推荐一个最佳的方案,并为推荐的最佳方案制定一个详细的实现计划。 用户和有关人员评审所推荐的最佳方案。,4,典型的总体设计过程(二),4. 功能分解 确定系统有哪些模块构成,以及这些模块之间的关系。 对于复杂的功能或模块,结合数据流图,进一步分解。 5. 设计软件结构 系统软件是由实现各个子功能的模块构成,软件结构是指模块组成的层次关系。 软件结构用层次图或结构图表示。 数据流图细化到适当的层次,可以映射出软件结构。 6. 设计数据库 结合需求分析阶段所确定的系统数据需求,进一步设计数据库。,5,典型的总体设计过程(三),7. 制定测试计划 开发早期考虑并制定测试计
3、划,有助于在设计时注意提高软件的可测试性。 8. 书写文档 系统说明:主要包括用系统流程图描绘的系统构成方案,组成系统的物理元素清单,成本/效益分析;对最佳方案的概括描述,精化的数据流图,用层次图或结构图描绘的软件结构,用IPO图或其他工具简要描述的各个模块的算法,模块间的接口关系,以及需求、功能和模块三者之间的交叉参照关系等。 用户手册:根据总体设计阶段的结果,更正在需求分析阶段产生的用户手册。 测试计划:包括测试策略,测试方案,预期的测试结果,测试进度计划等。 详细的实现计划 数据库设计结构 9. 审查和复审 技术审查系统开发方 管理复审系统使用者,6,5.2 设计原理,模块化 抽象 逐步
4、求精 信息隐藏和局部化 模块独立,7,模块化(一),定义:是指能够相对独立的实现一定功能的程序代码。简单的讲,模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。“复杂的问题分解成许多容易解决的小问题”。 表现形式:过程、函数、子程序、宏;面向对象方法学中的对象、对象内的方法。 优点: 软件结构清晰,便于设计、交流 容易测试、调试,有助于提高软件的可靠性 提高软件的可修改性 有助于软件开发项目的组织与管理,8,模块化(二),缺点:当模块数目增加时每个模块的规模将减小,开发单个模块需要的成本(工作量)减少了;
5、但是,随着模块数目增加,设计模块间接口所需要的工作量将增加,并且在模块交互时易发生错误。 图5.1 模块化和软件成本,9,抽象,定义:是指抽出事物的本质特性并加以描述,但是不考虑它们的细节。 应用:一个复杂系统可以用一些高级的抽象概念构造和理解,这些高级概念又可以用一些较低级的概念构造和理解,如此进行下去,直至最低层次的具体元素。 软件工程过程的每一步都是对软件解法的抽象层次的一次精化。在可行性研究阶段,软件作为系统的一个完整部件;在需求分析期间,软件解法是使用在问题环境内熟悉的方式描述;当由总体设计向详细设计过渡时,抽象的程度随之减少;最后,当源程序实现,即达到抽象的最低层。 抽象与模块化的
6、关系:软件结构顶层的模块,控制系统的主要功能并且影响全局;在软件结构底层的模块,完成对数据的一个具体处理,用自顶向下由抽象到具体的方式分配控制,简化软件的设计和实现,提高软件的可理解性和可测试性,并且使软件更容易维护。,10,逐步求精,定义:是一种自顶向下的设计策略:通过逐步分解对功能的宏观陈述而开发出层次结构,直至最终得出用程序设计语言表达的程序。 实质:求精就是细化的过程。 求精与抽象的关系:互补性:抽象使设计者说明过程和数据,但却忽略低层的细节;逐步求精则帮助设计者在设计过程中逐步揭示出低层的细节。,11,信息隐藏与局部化,定义:划分模块时,使得一个模块内包含的信息(过程和数据)对于不需
7、要这些信息的模块来说,是不能访问的。即隐藏每个模块所包含的私有信息。 所谓局部化是指把一些关系密切的软件元素物理地放得彼此靠近。局部化有助于实现信息隐藏。 应用:在模块中,隐藏的是模块的实现细节;模块之间的交互是为了完成系统功能而必须交换的信息。 优点:易修改。,12,模块独立(一),定义:是指每个模块完成一个相对独立的特定子功能,并且和其他模块之间的关系很简单。 优点: 容易设计和开发。功能分割相对独立,可以简化接口,并且便于分工合作开发。 独立的模块比较容易测试和维护。 度量标准: 耦合:衡量不同模块彼此间互相依赖(连接)的紧密程度。 内聚:衡量一个模块内部各个元素彼此结合的紧密程度。,1
8、3,模块独立(二):耦合分类,数据耦合:两个模块间通过参数交换的信息仅是必须的数据。 控制耦合:传递的交换信息中有控制信息,有时这种控制信息以数据的形式出现。 特征耦合:整个数据结构作为参数传递而被调用的模块只需要使用其中的一部分数据元素。即:被调用的模块可以使用的数据多于它确实需要的数据,这将导致对数据的访问失去控制。 公共环境耦合:两个或多个模块通过一个公共数据环境相互作用。公共环境可以是全程变量、共享的通信区、内存的公共覆盖区、存储介质上的文件、物理设备等。 内容耦合:下列情况之一 一个模块访问另一个模块的内部数据 一个模块不通过正常入口而转到另一个模块的内部 两个模块有一部分程序代码重
9、叠 一个模块有多个入口(这意味着一个模块有几种功能),14,模块独立(二)(续),耦合应用原则 尽量使用数据耦合 少用控制耦合和特征耦合 限制公共环境耦合的范围 完全不用内容耦合。,15,模块独立(三):内聚,低内聚 偶然内聚:一个模块完成一组任务,这些任务间即使存在关系,关系也是很松散的。 逻辑内聚:一个模块完成的任务在逻辑上是相同或相似的。 时间内聚:一个模块包含的任务必须在同一段时间内执行。 中内聚 过程内聚:模块内的处理元素是相关的,并且必须以特定的次序执行。 通信内聚:模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据。 高内聚 顺序内聚:模块内的处理元素和同一个功能密切相
10、关,而且这些处理必须顺序执行,即:一个处理元素的输出数据作为下一个处理元素的输入数据。 功能内聚:模块内所有处理元素属于一个整体,完成一个单一的功能。,16,模块独立(三):内聚(续),内聚的优劣评分 功能内聚 10分 时间内聚 3分 顺序内聚 9分 逻辑内聚 1分 通信内聚 7分 偶然内聚 0分 过程内聚 5分 应用原则 设计时不必精确确定内聚的级别,力争做到高内聚。 辨认低内聚的模块,通过修改设计提高模块的内聚程度,降低模块间的耦合程度,以获得较高的模块独立性。 内聚与耦合的关系 模块内的高内聚往往意味着模块间的松耦合 是模块化设计的有力工具 实践表明内聚比耦合更重要,17,5.3 启发规
11、则(一),1.改进软件结构提高模块独立性 例如:多个模块共用的一个子功能可以独立成一个模块,由这些模块调用;通过分解或合并模块以减少控制信息的传递及对全程数据的引用,并且降低接口的复杂程度。 2. 模块规模应该适中 模块的规模不应过大,不超过60行语句为宜。 过大的模块通常是分解不充分;进一步分解必须符合问题结构,并且分解后不应该降低模块独立性。 过小的模块开销可能大于有效操作,而且模块数目过多将使系统接口复杂。,18,5.3 启发规则(二),3.深度、宽度、扇入、扇出应适当 深度:表示软件结构中控制的层数,能粗略地标志一个系统的大小和复杂程度。 宽度:软件结构内同一层次上的模块总数的最大值。
12、 扇出:一个模块直接调用的下级模块数目 扇入:一个模块直接被调用的上级模块数目。 4.模块的作用域应该在控制域之内 模块的作用域:模块内一个判定所影响到的所有模块的集合。 模块的控制域:模块本身以及所有直接或间接从属于它的模块的集合。 设计原则:模块的作用域不超出模块的控制域。,19,图5.2模块的控制域与作用域,20,5.3 启发规则(三),5.力争降低模块接口的复杂程度:仔细设计模块接口,使得信息传递简单,并且和模块的功能一致。 6.设计单入口单出口的模块:防止模块间的内容耦合。 7.模块功能应该可以预测,同时防止模块功能过于局限。,21,层次图 HIPO图 结构图,5.4 描绘软件结构的
13、图形化工具,22,图5.3 层次图,层次图用来描绘软件的层次结构:一个矩形框代表一个模块,方框间的连线表示调用关系。,23,图5.4 带编号的层次图(H图),添加编号,最顶层除外。 每个方框(模块)对应一张IPO图,描绘模块的处理过程。,24,图5.5 结构图的例子,方框之间的箭头或直线表示模块的调用关系; 带注释的箭头表示模块调用过程中来回传递的信息:箭头尾部是空心圆表示传递的是数据,实心圆表示传递的是控制信息。,25,图5.6 选择判定,图5.7 模块M循环调用模块A、B、C,26,层次图和结构图的应用小结,描绘软件结构的图形化工具。 没有严格表示模块的调用次序。 没有指明什么时候调用下层
14、模块。即:没有确定调用时机。 只表明一个模块调用哪些模块,至于模块内还有没有其他成分则完全没有表示。 层次图通常用来描绘软件结构的文档;结构图检查设计的正确性和评价模块的独立性。,27,基于数据流图描绘的数据信息流在系统中加工和流动情况,映射出软件体系结构。 信息流的类型: 变换流 事务流,5.5 面向数据流的设计方法,28,图5.8 变换流,信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理以后再沿输出通路变换成外部形式离开软件系统。,29,图5.9 事务流,数据(事务)沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来
15、执行。,30,图5.10 面向数据流方法的设计过程,31,总体设计阶段的基本目的:用比较抽象概括的方式确定系统如何完成预定的任务,即:应该确定系统的物理配置方案,并且确定组成系统的每个程序的结构。 总体设计阶段主要由两部分组成;系统设计:从数据流图出发设想完成系统功能的若干种合理的物理方案,分析员应该仔细分析比较这些方案,并且和用户共同选定一个最佳方案;软件结构设计:确定软件由哪些模块组成以及这些模块之间的动态调用关系。 模块独立原理是软件结构设计时遵循的最主要原理。 自顶向下逐步求精是进行软件结构设计的常用途径。 如果存在详细的数据流图,可以使用面向数据流的设计方法,用形式化的方法由数据流图映射出软件结构。,小结,