【软考】耦合内聚总论
耦合和内聚总是傻傻的分不清楚,这次要彻底解决这个问题
一、耦合 (模块与模块的联系)
| 耦合(耦合性从低到高) | 解释 |
|---|---|
| 无直接耦合 | 两个模块无直接关系 |
| 数据耦合 | 两个模块有调用关系 |
| 标记耦合 | 传递的数据结构 |
| 控制耦合 | 传递的控制变量 |
| 外部耦合 | 一组模块都访问同一全局简单变量 |
| 公共耦合 | 两个程序共享一个文件 |
| 内容耦合 | 内容耦合已经基本杜绝,一个模块直接使用另外一个模块的数据 |
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=nf=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控制耦合
小结
经此一役,耦合和内聚以尽收囊中。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
