总体设计
(对应软件生命周期中软件开发时期的总体设计阶段)
总体设计的过程由两个主要阶段组成:
- 系统设计阶段,确定系统的具体实现方案
+ 设想供选择的方案
+ 选取合理的方案
+ 推荐最佳方案 - 结构设计阶段,确定软件结构,模块划分、模块之间的调用关系
+ 功能分解
+ 设计软件结构
+ 设计数据库
+ 制定测试计划
+ 书写文档
+ 审查和复审
设计原理(原则):模块独立原理
- 模块化(箭头从调用模块指向被调用模块,表示调用模块调用了被调用模块)
+ 模块调用关系
+ 模块间接口的表示
- 抽象
- 逐步求精
- 信息隐藏和局部化
- 模块独立
模块独立程度的两个定性标准度量
- 耦合(耦合要低,不同模块互相依赖的紧密程度)
+ 非直接耦合/完全独立
+ 数据耦合(两个模块交换的信息仅仅是数据,尽量使用)
+ 控制耦合(传递的信息中有控制信息,少用)
修改控制耦合为数据耦合:
+ 特征耦合(整个数据结构作为参数传递,少用)
改为数据耦合:
+ 公共环境耦合(多个模块通过一个公共数据环境相互作用,限制范围)
+ 内容耦合(最高程度的耦合,完全不用)
+ 总结:
- 内聚(内聚要高,模块内部各元素结合的紧密程度)
+ 偶然内聚(各元素之间没有实质性联系)
+ 逻辑内聚(完成的任务在逻辑上属于相同或相似的一类)
分解:
+ 时间内聚(一个模块包含的任务必须在同一段时间内执行)
+ 过程内聚(一个模块内的处理元素是相关的,而且必须以特定次序执行)
+ 通信内聚(模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据)
+ 顺序内聚(模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行)
+ 功能内聚(模块内所有处理元素属于一个整体,完成一个单一的功能,最高程度的内聚,模块可重用)
+ 总结
启发规则
- 模块功能应该可以预测
**功能可预测:**如果一个模块可以当做一个黑盒子,只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。 - 力争降低模块接口的复杂程度
- 设计单入口单出口的模块
- 模块规模应该适中(通常规定50~100行语句,最多不超过500行)
- 改进软件结构提高模块独立性
- 模块的作用域应该在控制域之内
模块的作用域:定义为受该模块内一个判定影响的所有模块的集合。
模块的控制域:是这个模块本身以及所有直接或间接从属于它的模块的集合。 - 深度、宽度、扇出和扇入都应适当
深度:软件结构中控制的层数
宽度:同一个层次上的模块总数的最大值。
扇出:一个模块直接控制(调用)的模块数目。
扇入:有多少个上级模块直接调用它。
总结:
- 总体设计阶段的基本目的
用比较抽象概括的方式确定系统如何完成预定的任务 - 总体设计阶段的两个小阶段
系统设计(完成系统功能的物理方案)
软件结构设计(模块划分、模块之间的调用关系) - 进行软件结构设计时要遵循的主要的原理
模块独立原理 - 进行软件结构设计时的一种有效方法
从抽象到具体地构造出软件的层次结构 - 启发式规则
- 软件结构设计的常用途径
自顶向下逐步求精 - 在详细设计和编码之前进行结构设计的好处
在软件开发早期站在全局高度对软件结构进行优化,可以使软件质量得到重大改进,而代价却不高。