软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。
一般模块之间可能的连接方式有七种,构成耦合性的七种类型。它们之间的关系为(独立性由强到弱)
1.1 非直接耦合(NondirectCoupling)如果两个模块之间没有直接关系,它们之间的联系完全是通过主模块的控制和调用来实现的,这就是非直接耦合。这种耦合的模块独立性最强。
1.2 公共耦合(CommonCoupling)若一组模块都访问同一个公共数据环境,则它们之间的耦合就称为公共耦合。公共的数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。 这种耦合会引起下列问题:
所有公共耦合模块都与某一个公共数据环境内部各项的物理安排有关,若修改某个数据的大小,将会影响到所有的模块。
无法控制各个模块对公共数据的存取,严重影响软件模块的可靠性和适应性。
公共数据名的使用,明显降低了程序的可读性。
公共耦合的复杂程度随耦合模块的个数增加而显著增加。若只是两个模块之间有公共数据环境,则公共耦合有两种情况。
若一个模块只是往公共数据环境里传送数据,而另一个模块只是从公共数据环境中取数据,则这种公共耦合叫做松散公共耦合。若两个模块都从公共数据环境中取数据,又都向公共数据环境里送数据,则这种公共耦合叫做紧密公共耦合。只有在模块之间共享的数据很多,且通过参数表传递不方便时,才使用公共耦合。否则,还是使用模块独立性比较高的数据耦合好些。
1.5 控制耦合(ControlCoupling) 如果一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能,就是控制耦合。这种耦合的实质是在单一接口上选择多功能模块中的某项功能。因此,对所控制模块的任何修改,都会影响控制模块。另外,控制耦合也意味着控制模块必须知道所控制模块内部的一些逻辑关系,这些都会降低模块的独立性。
1.7 内容耦合(ContentCoupling)如果发生下列情形,两个模块之间就发生了内容耦合。
一个模块直接访问另一个模块的内部数据
一个模块不通过正常入口转到另一模块内部
两个模块有一部分程序代码重叠(只可能出现在汇编语言中)
一个模块有多个入口
在内容耦合的情形,所访问模块的任何变更,或者用不同的编译器对它再编译,
都会造成程序出错。好在大多数高级程序设计语言已经设计成不允许出现内容
耦合。它一般出现在汇编语言程序中。这种耦合是模块独立性最弱的耦合。
二、内聚度是前述信息隐藏和局部化概念的自然扩展,它标志一个模块内部各成分彼此结合的紧密程度。内聚度按其高低程度可分为7级,内聚度越高越好。
内聚度按其高低程度可分为7级,内聚度越高越好。
低级内聚(偶然内聚、逻辑性内聚、时间性内聚)
中级内聚(过程性内聚、通信性内聚)
高级内聚(顺序性内聚、功能性内聚)
2.1 偶然内聚(coincidental cohesion)内聚性最差,指一个模块内各成分为完成一组功能而组合在一起,它们相互之间即使有关系,也很松散。常见的偶然性内聚为,当程序员写完一个程序后发现有一组语句多处出现,于是为节省内存便将这组语句单独组成一个模块。
2.2 逻辑性内聚(logical cohesion)如果一个模块完成的诸任务逻辑上相关(例如,一个模块产生所有与类型无关的输入)
2.3 时间性内聚(temporal cohesion)如果一个模块包含的诸任务必须在同一时间段内执行(例如,一个初始化模块)
2.4 过程性内聚(procedural cohesion)模块的过程性内聚度是指,模块内成分彼此相关,并且必须按特定的次序执行
2.5 通信性内聚(communicational cohesion)模块的通信性内聚度是指,模块中各成分都将对数据结构的同一区域进行操作,以达到通信。
2.6 顺序性内聚(sequential cohesion)如果一个模块内的各处理成分均与同一功能相关,且这些处理必须顺序执行
2.7 功能性内聚(functional cohesion)如果模块内所有成分形成一个整体,完成单个功能,功能内聚是最高程度的内聚形式