模块
-
指整个程序中一些相对对独立的程序单元,每个程序单元完成和实现一个相对独立的软件功能。通俗点就是一些功能独立的程序段。
-
每个程序模块要有自己的名称、标识符、接口等外部特征。
-
模块的内聚:模块内部的交互程度
-
模块间的耦合:模块之间的交互程度
内聚
- 模块内部的交互程度越高越好
- 模块的内聚性越高越好
偶然性内聚(Coincidental Cohesion)
-
一个模块内的各处理元素之间没有任何联系,只是偶然地被凑到一起。
-
问题
- 降低了模块的可读性
- 降低了模块的可维护性
- 模块的可重复时候性也非常低
-
解决方法
- 将该模块拆分成多个模块
- 然后让每个模块只做一件事情
逻辑性内聚(Logical Cohesion)
- 指模块内执行多个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
- 问题
- 模块内部结构非常复杂,接口也非常复杂
- 需读懂接口,否则将无法调用
- 模块将非常难以修改
- 在逻辑型内聚的内部,有很多操作交织在一起,增加了调用模块和被调用模块之间的耦合度
- 这种调用关系导致了比较低的效率
时间性内聚(Temporal Cohesion)
- 把需要同时执行的动作组合在一起形成的模块。
- 如:异常处理模块,终止模块:释放一些资源,关闭一些正打开的文件(这些操作本质上没有什么关联性,只不过这些操作需要在相同的时间段内被执行。
- 问题
- 模块内部相互之间的关联性是非常弱的,这些操作显然跟其他模块内部的操作有较强的关联度
- 不可重用
过程性内聚(Procedural Cohesion)
- 构件或者操作的组合方式时,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递。
- 问题
- 模块不可重用
通信性内聚
- 执行一系列与产品要遵循的步骤顺序有关的操作,并且,如果所有操作都对相同的数据进行,则该模块具有通信性内聚。
- 这些操作在执行的过程上相关联,而且这些操作在相同的输入或输出数据进行操作。
- 问题
- 具有非常弱的可重用性
功能性内聚
-
指模块内所有元素共同完成一个功能,缺一不可,因此模块不能再分割。
-
只做一个操作
-
优点
- 具有更高的可重用性
- 使纠错性的维护更加容易(因为具有单一的功能,而且更容易做到故障隔离,自然也会造成更少的回归错误)
- 该产品更容易进行扩展
信息性内聚
- 如果模块进行许多操作,每个都有各自的入口点,每个操作的代码相对独立,而且所有的操作都对相同的数据结构完成。