ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

内聚与耦合的实例分析

2019-03-15 20:52:17  阅读:505  来源: 互联网

标签:int sum 员工 实例 模块 内聚 耦合


一:内聚的分类与实例分析:

    

1.偶然性内聚:模块内的各个任务在功能上没有实质性联系,纯属“偶然”因素组合了块内各个互不相关的任务。

例如:一个处理正方形的模块有两个功能:计算面积,画出这个正方形。

如何改进?

    两个模块分别计算面积和画图。

常见错误:A模块中有三条语句(一条赋值,一条求和,一条传参),表面上看不出任何联系,但是B、C模块中都用到了这三条语句,于是将这三条语句独立出来合并成了模块A。模块A中就是偶然内聚。

2.逻辑性内聚:模块通常由若干个逻辑功能相似的任务组成,通过模块外引入的一个开关量选择其一执行。这种内聚增大了模块间的耦合。

举例:一个模块负责打印季度开支报告、月份开支报告和日开支报告,具体打印哪一个报告由传入的控制标志决定,这个模块具有逻辑性内聚。

如何改进?

    建立三个模块,分别负责打印季度开支报告、月份开支报告和日开支报告。改进原来的模块,让它根据传入的控制标志来调用这三个模块之一。

3.过程性内聚:模块内的各个任务必须按照某一特定次序执行。

     过程内聚与顺序内聚的区别主要在于:顺序内聚中是

     数据流从一个处理单元流到另一个处理单元,而过程

     内聚 中是控制流从一个动作流向另一个动作。

4.时间性内聚:模块内的各个任务由相同的执行时间联系在一起。例如,初始化模块,紧急故障处理模块。

 

5. 功能性内聚:模块各个成分结合在一起,完成一个特定的功能。功能性模块具有内聚性最强、与其他模块联系少的特点。

   一个模块根据员工出生日期计算员工年龄,该模块具有功能性内聚。

 

6.顺序性内聚:模块内的各个任务是顺序执行的。通常,上一个任务的输出是下一个任务的输入。

  一个模块根据员工出生日期计算员工年龄、退休时间,

 如果是根据员工出生日期计算员工年龄,再由员工年龄计算其退休时间,该模块就具有顺序性内聚;

7. 通信性内聚:模块内部的各个任务靠公用数据联系在一起,即都使用同一个输入数据,或者产生同一个输出数据。

如果是根据员工出生日期分别计算员工年龄和退休时间,该模块就具有通信性内聚。

如何改进?

 

改为两个模块,一个模块根据员工出生日期计算年龄,一个模块根据员工出生日期计算退休时间

 

二.耦合的分类及实例分析

耦合性是对一个软件结构内不同模块之间互连程度的度量。

      耦合性的强弱取决于模块间接口的复杂程度,以及通过接口的数据类型和数目。

1. 非直接耦合:同级模块相互之间没有信息传递,属于非直接耦合。

一个是处理正方形面积的模块,一个是处理订单打印的模块;

      2. 数据耦合:调用下属模块时,如果交换的都是简单变量,便构成数据耦合。

sum(int a,int b)
{int c;
c=a+b;
return(c);
}
main()
{int x,y;
.
.
.printf("x+y=%d",sum(x,y));
}
主函数与sum函数之间即为数据耦合关系

   3.特征耦合:调用下属模块时,如果交换的是数据结构,便构成特征耦合。由于传递的是数据结构,不仅数据量增加,而且会使模块的相关性增加。

 sum(int a[],int b)
{int c=0;

for(int i=0;i<=b;i++)

{

c=c+a[i];

}

return(c);
}
main()
{int x;

int y[10];
.
.
.printf("%d",sum(x,y));
}
主函数与sum函数之间即为特征耦合关系

    4.控制耦合:模块间传递的信息不是一般的数据,而是作为控制信息的开关值或标志量。

    例如,逻辑性内聚的模块调用就是典型的控制耦合。

       

 void output(flag)
{
if(flag)printf("OK!");
else printf("NO!");
}
main()
{int flag;
..
..
..
output(flag);
}
主函数与output函数之间即为控制耦合关系.

5.外部耦合:若允许一组模块访问同一个全局变量,可称它们为外部耦合。

static int i;

int main(){

sum(i);

add(i);

return 0;

}

sum()和add()为两个模块

6.公共耦合:若允许一组模块访问同一个全局性的数据结构,则称它们为公共耦合。全局性的数据结构可以是共享的通信区、公共的内存区域、任何存储介质文件、物理设备等。

                                                       

 

                                    松散的公共耦合                                                                                                        紧密的公共耦合

7.内容耦合:若一个模块可以直接访问另一个模块中的内部数据,或者一个模块直接转到另一个模块的内部,或者一个模块有多个入口,则称为内容耦合。如:goto语句

                 

class A {

           public int m;

       }

class B{

     A  a = new A();

     a. m += 1;

}

应改为

class A {

     private int m;

}

 

 

function a(){
    return 'kk';
}

function b(){
   alert(a());
}

b();

应改为:

重构成

a 不变


function b(p1){
   alert(p1);
}

b(a());

 

 后续有待更改......

标签:int,sum,员工,实例,模块,内聚,耦合
来源: https://www.cnblogs.com/wacyy/p/10539382.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有