耦合和内聚总是傻傻的分不清楚,这次要彻底解决这个问题
一、耦合 (模块与模块的联系)
耦合(耦合性从低到高) | 解释 |
无直接耦合 | 两个模块无直接关系 |
数据耦合 | 两个模块有调用关系 |
标记耦合 | 传递的数据结构 |
控制耦合 | 传递的控制变量 |
外部耦合 | 一组模块都访问同一全局简单变量 |
公共耦合 | 两个程序共享一个文件 |
内容耦合 | 内容耦合已经基本杜绝,一个模块直接使用另外一个模块的数据 |
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控制耦合
小结
经此一役,耦合和内聚以尽收囊中。