文章目录
- 第5章 总体设计
- 5.1 设计过程
- 例题
- 5.2 设计原理
- 5.2.1 模块化
- 模块化的优势
- 例题
- 5.2.2 抽象
- 5.2.3 逐步求精
- 求精实际上是细化的过程
- 与抽象的关系
- 5.2.4 信息隐藏和局部化
- 5.2.5 模块独立
- 模块独立的重要性
- 模块独立的定性标准度量
- 耦合
- ① 无直接耦合
- ② 数据耦合
- ③ 标记耦合
- ④ 控制耦合
- ⑤ 外部耦合
- ⑥ 公共耦合
- ⑦ 内容耦合
- 例题
- 内聚
- ① 偶然性内聚
- ② 逻辑性内聚
- ③ 时间内聚
- ④ 过程内聚
- ⑤ 通信内聚
- ⑥ 顺序内聚
- ⑦ 功能性内聚
- 例题
- 5.3 启发规则
- 例题
第5章 总体设计
总体设计是决定”怎样做”。也就是概括的说,系统应该如何实现,因此总体设计也被称作概要设计。
5.1 设计过程
例题
5.2 设计原理
5.2.1 模块化
模块是由边界元素限定的相邻程序元素(例如,数据说明,可执行的语句)的序列,而且有一个总体标识符代表它。模块是构成程序的基本构件。
模块化就是把程序划分成独立命名且可独立访问的模块,每个模块完成一个子功能,把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
模块化是为了使一个复杂的大型程序能被人的智力所管理,是软件应该具备的唯一属性。
模块化的优势
• 模块化可以使软件结构清晰易于理解。
• 模块化使软件易于测试和调试,有助于提高软件的可靠性加粗样式。
• 模块化能提高软件的可修改性。
• 模块化有助于软件开发工程的组织管理。
例题
5.2.2 抽象
定义:抽出事物的本质特性而暂时不考虑它们的细节。
软件工程过程的每一步都是对软件解法的抽象层次的一次精化
逐步精细和模块化的概念,与抽象是紧密相关的。
5.2.3 逐步求精
为了能集中精力解决主要问题而尽量推迟对问题细节的考虑.
求精实际上是细化的过程
与抽象的关系
• 抽象与求精是一对互补的概念。抽象是的设计师能够说明过程和数据,同时却忽略了底层细节。
• 求精帮助设计者在设计过程中逐步揭示底层细节。
• 这两个概念有助于设计者在设计演化过程中创造出完整的设计模型。
5.2.4 信息隐藏和局部化
局部化 : 是把一些关系密切的软件元素物理地放的彼此靠近。显然局部化有助于实现信息隐藏。
信息隐藏 : 信息隐藏原则定义和隐藏了模块内的过程细节和模块内的本地数据结构。
使用信息隐藏原理作为模块化系统设计的标准可为软件测试和维护期间带来极大好处。
5.2.5 模块独立
模块独立的概念是模块化、抽象、信息隐藏和局部化概念的直接结果。
模块独立的重要性
1)有效的模块化(即有独立的模块)的软件比较容易开发出来。
2)独立的模块比较容易测试和维护。
模块独立是好设计的关键,而设计又是决定软件质量的关键环节
模块独立的定性标准度量
① 耦合衡量不同模块彼此之间互相依赖(连接)的紧密程度。
② 内聚衡量一个模块内部各个元素彼此结合的紧密程度。
耦合
① 无直接耦合
无直接耦合是指调用模块和被调用模块之间没有直接数据联系。
② 数据耦合
数据耦合是指调用模块和被调用模块之间存在单变量之类的数据联系。
③ 标记耦合
标记耦合是指调用模块和被调用模块之间存在复杂结构变量(数组、结构、对象)之类的数据联系。
④ 控制耦合
控制耦合是指调用模块和被调用模块之间存在控制关联
⑤ 外部耦合
外部耦合是指多个模块访问全局变量。
⑥ 公共耦合
多个模块访问全局复杂结构变量。
公共环境
⑦ 内容耦合
运行调用模块控制被调用模块的内部数据。
例题
内聚
内聚标志着一个模块内各个元素彼此结合的紧密程度,它是信息隐藏和局部化概念的自然扩展。
① 偶然性内聚
模块由多个完成不同任务的语句段组成,各语句段之间的联系十分松散或根本没有任何联系
降低了可维护性,模块不可重用
② 逻辑性内聚
执行一系列相关的操作,执行哪个操作由调用者来选择。几个逻辑相关的功能放在同一模块中。
对文件记录执行插入、删除、修改的编辑模块
③ 时间内聚
执行一系列与时间相关的操作。如初始化把需要同时执行的动作组合在一起形成模块
模块内操作间关系很弱,但是与其他模块的操作却有很强的关联,重用性差。
④ 过程内聚
一组会依照特定顺序执行的程序放在同一模块中
操作间是弱连接,重用性差
⑤ 通信内聚
模块中所有元素都使用同一个数据结构上操作
缺乏重用性
⑥ 顺序内聚
如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据)
⑦ 功能性内聚
模块内所有元素执行同一功能,即只执行一个操作或只达到单一的目标。
易维护、重用性好、易扩充
例题
5.3 启发规则
- 改进软件结构提高模块独立性
- 模块规模应该适中
- 深度、宽度、扇出和扇入都应适当
- 模块的作用域应该在控制域之内
- 力争降低模块接口的复杂程度
- 设计单入口单出口的模块
- 模块功能应该可以预测
例题