0%

耦合与内聚

高内聚,低耦合!

耦合

图示

是对软件系统结构中,各模块间相互联系紧密程度的一种度量。

低耦合

无直接耦合

两个模块之间没有直接关系

数据耦合

一模块访问另一模块时,通过数据参数交换输入、输出信息。

举例:

  • 函数间通过参数传递参数
  • void fun1(int x)
    {
    //..........
    }
    void fun2()
    {
    int test;
    fun1(test)
    }

特征耦合(标记耦合)

两个模块通过传递数据结构加以联系,或都与一个数据结构有关系,则称这两个模块间存在特征耦合

危害:
当把整个数据结构作为参数传递时,被调用的模块虽然只需要使用其中的一部分数据元素,但实际可以使用的数据多亍它真正需要的数据,这将导致对数据访问失去控制。
举例

  • 函数1需要学生成绩绩点,函数2可实现该功能,但函数1调用函数2时将全部学生信息这一数据结构传递了过去,尽管函数2只需要成绩信息。

中耦合

控制耦合

模块间传递的是控制信息(如开关、标志、名字等),控制被调用模块的内部逻辑。 比如一个模块实现了两个功能通过传入控制参数选择使用的是哪个功能。

控制耦合增加了理解和编程的复杂性,调用模块必项知道被调模块的内部逻辑,增加了相互依赖。

解决方法:

  1. 将被调用模块内的判定上移到调用模块中迚行
  2. 被调用模块分解成若干单一功能模块

public class ControlCoupling {
//实现了计算体积和面积两个功能,通过传入method来决定功能
public int calculate(int x,int y,int z,int method)
{
if(method==0)
{
return x*y*z;
}
else
{
return (x*y+x*z+y*z)*2;
}
}
public int fun()
{
//..........
calculate(1,2,3,0);
//..........
}

}

较强耦合

公共环境耦合

一组模块引用同一个公用数据区(全局数据结构,共享通讯区,内存公共覆盖区等)

两种情况:

  1. 一模块送数据,另一模块取,比较松散。
  2. 两模块既往公共环境送又从里面取,较为紧。

举例:

  • 全局变量

缺点:

  1. 软件可理解性降低
  2. 诊断错诨困难
  3. 软件可维护性差
  4. 软件可靠性差

强耦合

内容耦合

  1. 一个模块访问另一个模块的内部数据
  2. 不通过正常入口进入程序内部(goto语句)
  3. 部分代码重叠(只出现在汇编中)
  4. 一个模块有多个入口(意味着一个模块有多种功能)

举例:goto语句

内聚性

又称块内联系,指一个模块内部各个元素彼此结合的紧密程度的度量,若一个模块内各元素联系越紧密则他的内聚行就越高。

低内聚

时间内聚

模块完成的功能必项在同一时间内执行,这些功能因时间因素关联在一起。

举例:
初始化函数

逻辑内聚

把几种相关功能(逻辑上相似的功能)组合在一模块内,每次调用由传给模块的参数确定执行哪种功能。(类似控制耦合)。

  • 比如一个函数可以通过控制参数决定计算体积或者面积

偶然内聚

一个模块内的组成成分在功能上是互不相关的。

  • 在写代码时,写了两个模块后,发现其中的代码有重叠,把他们单独拿出来。

中内聚

通信内聚

模块内各部分使用相同的输入数据,或产生相同的输出结果

  • 比如计算员工工资,仅在员工信息数据结构中操作即可

过程内聚

模块内各处理元素相关,且必项以特定次序执行。

  • 比如先填写账号,再获取验证码,最后识别验证码

高内聚

功能内聚

模块仅包括为完成某个功能所必项的所有成分。模块所有成分共同完成一个功能,缺一不可内聚性最强。

比如登录时在一个模块内完成对用户信息的校验

顺序内聚

如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必项顸序执行(通常一个处理元素的输出数据作为下一个处理元素的输入数据),则称为顺序内聚。

  • 先通过用户id获取用户学号,在通过学号查找学生信息