文章目录
启发规则有:
- 改进软件结构提高模块独立性
- 模块规模应该适中
- 深度、宽度、扇入和扇出应适当
- 模块的作用域应该在控制域之内
- 力争降低模块接口的复杂程度
- 设计单入口单出口的模块
- 模块功能应该可以预测但要防止过分局限
(1)改进软件结构提高模块独立性
设计出软件的初步结构后,应该审查分析这个结构,通过模块分解或合并,力求降低耦合提高内聚。
(2)模块规模应该适中
- 过大的模块往往是由于分解不充分,但是进一步分解必须符合问题结构,分解后不应该降低模块独立性
- 过小的模块开销大于有效操作,而且模块数目过多将使系统接口复杂。因此过小的模块有时不值得单独存在
(3)深度、宽度、扇入和扇出应适当
好的软件结构:顶层扇出较高,中层扇出较少,底层模块有高扇入
深度:表示软件结构中控制的层数,能粗略地标志一个系统的大小和复杂程度
- 深度为3
可以按文件夹的的层级目录结构来对照理解,按照层级来看,
本道题中
第一层:某系统
第二层:功能1,功能2,功能3
第三层:功能2.1,功能2.2,功能2.3,功能3.1,功能3.2
(注意:这里功能3.1和功能3.2其实是同一个层级的,类比文件目录结构不难看出),深度即为这里分析的层数,所以这题的深度为3。
宽度:宽度是软件结构内同一个层次上的模块总数的最大值。宽度越大系统越复杂。对宽度影响最大的因素是模块的扇出
- 宽度为5
第三层:功能2.1,功能2.2,功能2.3,功能3.1,功能3.2
第三层的模块总数显然最大,为5,
扇出:是一个模块直接控制的模块数目,设计扇出应注意
- 扇出过大意味着模块过分复杂,需要控制和协调过多的下级模块,扇出太大一般是因为缺乏中间层次,应适当增加中间层次的控制模块
- 扇出过小可把下级模块分解成若干个子功能模块,或合并到它的上级模块中去。分解模块或合并模块必须符合问题结构,不能违背模块独立原理
- 一个设计得好的典型系统的平均扇出通常是3或4
- 最大扇出数是3
扇入:表明有多少个上级模块直接调用它。扇入越大则共享该模块的上级模块数目越多。但是,不能违背模块独立原理单纯追求高扇入
(4)模块的作用域应该在控制域之内
A:定义
- 作用域:指受该模块内一个判定影响的所有模块的集合
- 控制域:是这个模块本身以及所有直接或者间接从属于它的模块的集合
B:规则
在一个设计得很好的系统中,所有受判定影响的模块应该都从属于做出判定的那个模块,最好局限于做出判定的那个模块本身及它的直属下级模块
C:修改方法(了解)
- 把做判定的点往上移
- 把在作用域内但不在控制域内的模块移到控制域内
(5)力争降低模块接口的复杂程度
模块接口复杂是软件发生错误的一个主要原因。应该仔细设计模块接口,使得信息传递简单并且和模块的功能一致。接口复杂或不一致(即看起来传递的数据之间没有联系)是紧耦合或低内聚的征兆,应该重新分析这个模块的独立性
(6)设计单入口单出口的模块
这条规则警告软件工程师不要使模块间出现内容耦合。当从顶部进入模块并且从底部退出来时,软件是比较容易理解的,因此也是比较容易维护的
(7)模块功能应该可以预测但要防止过分局限
模块的功能应该能够预测,但也要防止模块功能过分局限。
- 可预测:如果一个模块可以当做一个黑盒子,即只要输入的数据相同就产生同样的输出,这个模块的功能就是可以预测的。由于内部存储器对于上级模块而言是不可见的,所以这样的模块既不易理解又难于测试和维护
- 过分局限:如果一个模块任意限制局部数据结构的大小,过分限制在控制流中可以做出的选择或者外部接口的模式,那么这种模块的功能就过分局限,使用范围也就过分狭窄了。