版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yujing1314/article/details/83473014
耦合和内聚总是傻傻的分不清楚,这次要彻底解决这个问题
一、耦合 (模块与模块的联系)
耦合(耦合性从低到高) | 解释 |
---|---|
无直接耦合 | 两个模块无直接关系 |
数据耦合 | 两个模块有调用关系 |
标记耦合 | 传递的数据结构 |
控制耦合 | 传递的控制变量 |
外部耦合 | 一组模块都访问同一全局简单变量 |
公共耦合 | 两个程序共享一个文件 |
内容耦合 | 内容耦合已经基本杜绝,一个模块直接使用另外一个模块的数据 |
1. 无直接耦合
两个模块无直接关系
2.数据耦合
两个模块有调用关系,A模块调用B模块,传递简单的数据值
void main()
{
int b,a;
b=count(a);//主函数调用fa函数
}
Int count(int n)
{
n=n+1;
return n;
}
分析: main调用了fa的方法,中间传递简单的数值(整数)
3.标记耦合
传递的数据结构,比如数组、队列等。
Int main()
{
int b;
b=count(b[10]);
return b;
}
Int count(a[10])
{ //简单运算}
分析:两个函数之间传递的a[10]为数组(数据结构)
4.控制耦合
传递的控制变量
void main()
{
Int Q
If (age>1)
{
Q=0
Else Q=1
}
Fa(Q)
return Q
}
void count(int n)
{
If(n>1)
{printf("%d",1);}
Else
{printf("%d",2);}
}
分析:变量Q在函数count中为控制变量,可以选择不同的功能
5.外部耦合
模块间通过软件之外的环境连接,或者一组模块都访问同一全局简单变量。
Int a b
Void main()
{
Printf(ab);
}
Void count1()
{
Printf("%d",b);
}
Void count2()
{
Printf("%d",b);
}
分析:Main count1 count2 都存在外部耦合
6.公共耦合
两个程序共享一个文件
7.内容耦合
内容耦合已经基本杜绝,一个模块直接使用另外一个模块的数据
二、内聚 (模块内的联系)
内聚 (内聚性从高到低) | 解释 |
---|---|
功能内聚 | 最强内聚,模块内的所有元素共同完成同一个功能 |
顺序内聚 | 一个模块内的个各处理元素都密切相关且必须按顺序执行 |
通信内聚 | 模块内的所有处理元素都在同一个数据结构上操作 |
过程内聚 | 一个模块完成多个任务 |
时间内聚 | 需要同时执行的动作组合在一起形成的模块 |
逻辑内聚 | 模块内执行若干逻辑上相似的功能 |
偶然内聚 | 一个模块内的各处理元素无任何联系 |
例子:
1.功能内聚
int count(int n)
{
int f;
if (n=0)
{
f=1;
}
else
{
f=n+1;
}
return f;
}
分析:整个模块都是为了实现求n,为功能内聚
2.顺序内聚
前一功能元素的输出就是下一功能元素的输入
int count(int n)
{
int f,g;
if (n=0)
{
f=1;
}
else
{
g=n
f=g+1;
}
return f;
}
3.通信内聚
如果模块中所有元素都使用同一个输入数据和(或)产生同一个输出数据,则称为通信内聚
4.过程内聚
假设有一个子程序,它产生读取雇员的名字,然后是地址,最后是它的电话号码。这种顺序之所以重要,仅仅是因为它符合用户的要求,用户希望按这种顺序进行屏幕输入。另外一个子程序将读取关于雇员的其它信息。这个子程序是过程内聚性,因为是由一个特定顺序而不是其它任何原因,把这些操作组合在一起的。
5.时间内聚
编程开始时,程序员把对所有全局变量的初始化操作放在模块A中。模块A中就是时间内聚。
int a;
int b;
int c;
void main
{//客户端代码}
6.逻辑内聚
如果一个模块完成的任务在逻辑上属于相同或相似的一类(例如,一个模块产生各种类型的全部输出),称为逻辑模块;
7.偶然内聚
没有任何联系,只是被放到了一个模块里
void main()
{
int b,a;
b=1;//主函数调用fa函数
}
Int count(int n)
{
n=n+1;
return n;
}
三、小小检验
如果一个模块调用下层模块时传递一个数据结构,则这种耦合属于( )。
A 简单耦合 B直接耦合
C 标记耦合 D控制耦合
小结
经此一役,耦合和内聚以尽收囊中。