软件工程-第五章-总体设计
- 5. 总体设计
-
- 5.1 设计过程
- 5.2 设计原理
-
- 5.2.1 模块化
- 5.2.2 抽象
- 5.2.3 逐步求精
- 5.2.4 信息隐藏和局部化
- 5.2.5 模块独立
- 5.3 启发规则
- 5.4 描述软件结构的图形工具
-
- 5.4.1 层次图和 HIPO 图
- 5.4.2 结构图
- 5.5 面向数据流的设计方法
-
- 5.5.1 概念
- 习题
5. 总体设计
总体设计又称为概要设计或初步设计
5.1 设计过程
总体设计过程通常由两个主要阶段组成:
- 系统设计阶段:确定系统的具体实现方案
- 结构设计阶段:确定软件结构
典型的总体设计过程包括下述9个步骤:
- 设想供选择的方案
- 选取合理的方案
- 推荐最佳方案
- 功能分解
- 设计软件结构
- 设计数据库
- 制定测试计划
- 书写文档
- 审查和复审
5.2 设计原理
5.2.1 模块化
模块是由边界元素限定的相邻程序元素(例如,数据说明,可执行的语句)的序列,而且有一个总体标识符代表它。
模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
5.2.2 抽象
把相似的方面集中和概括起来,暂时忽略它们之间的差异,这就是抽象。
抽象就是抽出事物的本质特性而暂时不考虑它们的细节。
5.2.3 逐步求精
逐步求精:为了能集中精力解决最主要问题而尽量推迟对问题细节的考虑。
逐步求精是人类解决复杂问题时采用的基本方法,也是许多软件工程技术的基础。
5.2.4 信息隐藏和局部化
信息隐藏:应该这样设计和确定模块,使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说是不能访问的。
局部化:是指把一些关系密切的软件元素物理地放得彼此靠近。
5.2.5 模块独立
模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果。
模块的独立程度可以由两个定性标准度量:
- 内聚
- 耦合
- 耦合:
耦合是对一个软件结构内不同模块之间互连程度的度量。
耦合强弱取决于模块间接口的复杂程度,进入或访问一个模块的点,以及通过接口的数据。
耦合程度强烈影响着系统的可理解性、可测试性、可靠性、可维护性。
设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境的耦合的范围,完全不用内容耦合。
- 数据耦合:如果两个模块彼此间通过参数交换信息,而且交换的信息仅仅是数据。数据耦合是低耦合。
- 控制耦合:传递的信息中有控制信息(尽管有时这种控制信息以数据的形式出现)。控制耦合是中等程度的耦合,增加了系统的复杂程度。
- 特征耦合:当整个数据结构作为参数传递而被调用的模块只需要使用其中一部分数据元素时。
- 公共环境耦合:当两个或多个模块通过一个公共数据环境互相作用时。公共环境可以是全程变量、共享通信区、内存的公共覆盖区、任何存储介质的文件、物理设备等。
- 内容耦合:最高程度的耦合,如果出现下列情况之一就是内容耦合:
- ①一个模块访问另一个模块的内部数据
- ②一个模块不通过正常入口而转到另一个模块的内部
- ③两个模块有一部分程序代码重叠(只可能出现在汇编程序中)
- ④一个模块有多个入口(这意味着一个模块有几种功能)
- 内聚:
内聚标志着一个模块内各个元素彼此之间结合的紧密程度,它是信息隐藏和局部化概念的扩展。
理想内聚的模块只做一件事情。
模块内的高内聚往往意味着模块间的低耦合。
设计原则:力求高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度并且降低模块间的耦合程度,从而获得较高的模块独立性。
低内聚有如下几类:
- 偶然内聚:如果一个模块完成一组任务,这些任务彼此之间有关系,关系也是很松散的。如在一个程序内有一组语句在两处或多处出现,于是把这些语句作为一个模块以节省内存。
- 逻辑内聚:如果一个模块完成的任务在逻辑上属于相同或相似的一类。如一个模块产生各种类型的全部输出。
- 时间内聚:如果一个模块包含的任务必须在同一时间内执行。如模块完成各种初始化工作。
中内聚:
- 过程内聚:如果一个模块内的处理元素是相关的,且必须以特定次序执行。如流程图确定模块的划分,得到的往往是过程内聚的模块。
- 通信内聚:如果一个模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据。
高内聚:
- 顺序内聚:如果一个模块内的处理元素和同一个功能密切相关,且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。根据数据流图划分模块得到往往是顺序内聚模块。
- 功能内聚:如果模块内的所有处理元素属于一个整体,完成一个单一的功能,则称为功能内聚。功能内聚是最高程度的内聚。
7种内聚的优劣评分:
名称 | 评分 |
---|---|
功能内聚 | 10 |
顺序内聚 | 9 |
通信内聚 | 7 |
过程内聚 | 5 |
时间内聚 | 3 |
逻辑内聚 | 1 |
偶然内聚 | 0 |
5.3 启发规则
- 改进软件结构提高模块独立性
- 模块规模应该适中
- 深度、宽度、扇出和扇入都应适当
- 模块的作用域应该在控制域内
- 力争降低模块接口的复杂程度
- 设计单入口单出口的模块
- 模块的功能应该可以预测
5.4 描述软件结构的图形工具
5.4.1 层次图和 HIPO 图
层次图:用来描绘软件的层次结构。
层次图中的一个矩形框代表一个模块,方框间的连线表示调用关系而不像层次方框图那样表示组成关系。
5.4.2 结构图
一个方框代表一个模块,框内注明模块的名字或主要功能,方框间的箭头(或直线)代表模块的调用关系,注释表示来回传递的信息【尾部空心圆表示传递数据,实心圆代表传递控制信息】。
5.5 面向数据流的设计方法
5.5.1 概念
面向数据流的设计方法把信息流映射成软件结构,信息流的类型决定了映射的方法。
信息流有下述两种类型:
- 变换流:
信息沿输入通路进入系统,同时由外部形式变换成内部形式,进入系统的信息通过变换中心,经加工处理后再沿输出通路变换成外部形式离开软件系统。当数据流图具有这些特征时,这种信息流就叫做变换流。
习题
- 为每种类型的模块耦合举一个具体例子。
- 数据耦合:比如图书管理系统的交欠款和处理逾期借书就是数据耦合,通过数据输入输出交流信息,为数据耦合。
- 控制耦合:比如一个学生成绩查询系统,其查找模块就控制了查寻学生姓名、查询成绩等模块,为控制关系,是控制耦合。
- 特征耦合:比如交电费和交水费本身没有直接关系,但都与用户的交款模块产生相似特征。
- 公共环境耦合:如两个或多个模块对同一文件的读写操作。
- 内容耦合。即有下列情况时即出现内容耦合。
- (1)一个模块访问另一个模块数据;
- (2)一个模块不通过正常入口而转到另一个模块的内部;
- (3)两个模块有一部分代码重叠;
- (4)一个模块有多个入口。
- 为每种类型的模块内聚举一个具体例子。
- 偶然内聚:即模块内各部分之间没有联系,或者即使有联系也很松散,这种即为偶然内聚,它是内聚程度最低的模块。如一些没有任何联系的语句可能在许多模块中重复多次,程序员为了节省存储,把它们抽出来组成一个新的模块,这个模块就是偶然内聚模块。
- 逻辑内聚:即这种模块把几种功能组合在一起,每次调用时,由传送给模块的判定参数来确定该模块应执行哪一种功能。如根据输入的控制信息,或从文件中读入一个记录,或向文件写出一个记录。
- 时间内聚:这种模块大多数为多功能模块,但模块的各功能的执行与时间有关,通常要求所有功能必须在同一时间段内执行,例如初始化模块和终止模块。
- 过程内聚:即一个模块内的处理是相关的,而且必须以特定次序执行,则这个模块称为过程内聚模块。例如我们把流程图中的循环部分、判定部分、计算部分分成三个模块,这三个模块都是过程内聚模块。
- 通信内聚:如果一个模块内部各功能部分都使用可相同的数据输入,?或产生了可相同的数据输入,或产生了可相同的输出数据,则称之为通信内聚模块。通常,通信内聚模块是通过数据流图来定义的。
- 顺序内聚:即一个模块内处理元素和同一功能紧密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据据作为下一处理元素的输入数据)如在对员工加工资的数据库操作中,读取数据和更新数据即具有顺序内聚的关系。
- 功能内聚:即模块内部所有处理元素属于一个整体,完成一个单一的功能,?则称为功能内聚,功能内聚是最高程度的内聚。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!