1. 耦合
耦合描述的两个模块之间关系的复杂程度。
1.1. 耦合的种类
由强到弱:
内容耦合>公共耦合>重复耦合>控制耦合>印记耦合(标记耦合)>数据耦合>非直接耦合
1.2. 具体介绍
1.2.1. 内容耦合(Content Coupling)
如果发生下列情形,两个模块之间就发生了内容耦合。
- 一个模块直接访问另一个模块的内部数据;
- 一个模块不通过正常入口转到另一模块内部;
- 一个模块有多个入口。
例子:
- GOTO语句, 直接从模块A,跳转到模块B中的响应位置。
1.2.2. 公共耦合(Common Coupling)
一组模块访问同一个公共数据环境(如全局数据结构、共享的通信区、内存的公共覆盖区等)
1.2.3. 重复耦合
两个模块含有同样逻辑的重复代码
1.2.4.控制耦合(Control Coupling)
调用模块向被调用模块传递的信息,控制了被调用模块的内部逻辑。
这样调用模块必须充分理解被调用模块的内部结构,被调用模块也要能解析调用模块传入的参数。
例子:
A模块传给B模块成绩数组和控制开关(1,0)去求平均分或最高分。
若开关为1求平均分,为0求最高分。
解耦:
1.2.5.印记耦合(Stamp Coupling)
当被调用的模块可以使用的数据多于真实所需数据时,导致数据访问可能失控,给计算机犯罪提供机会.
被调用模块只是用了数据结构的一部分信息。对于被调用模块,必须对传入参数的结构具有充分的理解
例子:
解耦:
1.2.6.数据耦合(Data Coupling)
解释:如果一个模块访问另一个模块时,彼此之间是通过数据参数(不是控制参数、公共数据结构或外部变量)来交换输入、输出信息的,则称这种耦合为数据耦合。
例子:
//模块1
public class MathUtil{
public static void getPow(int x){
return x*x;
}
}
//模块2
public class M1{
public static void main(string[] args){
int a = 2;
int aa = MathUtil.getPow(a);
System.out.println(aa);
}
}
1.2.7. 非直接耦合(Nondirect Coupling)
解释:两个模块之间没有直接的关系,它们之间的联系完全通过主模块的控制和调用来实现。
例子:
子模块无需知道对方的存在,子模块之间的联系,全部变成子模块和主模块之间的联系。
参考
-
https://zhuanlan.zhihu.com/p/22281389
-
PPT
-
软件开发的技术基础
-
https://blog.csdn.net/qq_20480611/article/details/51329688