七种内聚和耦合概念和解耦说明

0.简介

高内聚,低耦合在软件设计中是经常听到的概念,本文将从其概念和七种内聚和七种耦合类型及其强弱关系以及实际解耦例子来实际分析,以达到对高内聚,低耦合设计思想的充分理解。

1.内聚、耦合概念

1)内聚,是一个软件工程常见词汇,其主要体现模块(对系统的拆分)内部的相关联程度的度量,相关联程度越高,内聚程度越高,下面是七种内聚类型,从左到右内部关联程度依次提高,其模块独立性也依次提高。
在这里插入图片描述

2)耦合,也是软件工程一个常见词汇,其用来表示一个系统的各个部分之间彼此关联、互相影响的程度。当各部分之间的关联越高时,其耦合也越高,下面是其中耦合类型,从做到右耦合越来越紧密,模块独立性依次降低。
在这里插入图片描述

2.七种内聚

1)偶然内聚:一个模块内部的元素没有关联关系,比如另外几个模块都要使用一些功能,便把这些不相干的功能组织成了一个模块,这就是偶然内聚。
2)逻辑内聚:几个逻辑上相关的功能被放在同一模块中。如一个模块读取各种不同类型外设的输入,通过内部if条件来进行判断。尽管逻辑内聚比偶然内聚合理一些,但逻辑内聚的模块各成分在功能上并无关系。
3)时间内聚:一个模块内的功能必须在同一时间执行(如初始化),其内部元素只是因为时间因素关联在一起。
4)过程内聚:一个模块完成多个任务,这些任务按照顺序执行。
5)通讯内聚:如果一个模块的所有成分都操作同一数据集或生成同一数据集,则称为通信内聚。
6)顺序内聚:如果一个模块的各个成分和同一个功能密切相关,而且一个成分的输出作为另一个成分的输入,则称为顺序内聚,其和过程内聚的区别在于其各部分有相关性。
7)功能内聚:指模块内的所有元素共同作用完成 一个功能 ,缺一不可。

3.七种耦合

1)无直接耦合:两个模块之间不直接传递信息,无直接关系,耦合关系最弱。
2)数据耦合:两个模块之间有数据传递,但其传递的仅仅是数据值。
3)标记耦合:两个模块之间传递参数表(数据结构),而不是通过简单的值来传递。
4)控制耦合:一个模块通过传送开关、标志、名字等控制信息,明显地控制选择另一模块的功能。
5)外部耦合:一组模块都访问同一全局简单变量而不是同一全局数据结构,而且不是通过参数表传递该全局变量的信息,则称之为外部耦合。
6)公共耦合:指通过一个公共数据环境相互作用的那些模块间的耦合。公共数据环境可以是全局数据结构、共享的通信区、内存的公共覆盖区等。
7)内容耦合:直接使用另外模块的数据,如不通过接口直接使用别的类的数据。

4.实际例子

从类角度考虑,可以结合设计模式,例如采用门面模式来减少客户端和子系统的耦合关系(关联关系),而是通过门面模式的接口来进行实现。

在这里插入图片描述

从接口角度考虑,看以下两段代码:

//1.求和和求平均值
std::vector<int> sumAndAvg(int a, int b)
{
    int sum = a + b;
    int avg = sum / 2;
    std::vector<int> res;
    res.push_back(sum);
    res.push_back(avg);
    return res;
}

//2.求和和平均值
int getSum(int a, int b)
{
    return a+b;
}
int getAvg(int a, int b)
{
    return (a+b)/2;
}

相较于第一种写法,第二种每个函数职责更为单一,把两者的直接依赖关系去掉,更为松散和易于维护,这种拆分方式也是解耦的一种方法,简单来说,解耦就是是减少耦合的过程,使得模块或组件之间的依赖尽可能小。这样可以使得代码更加模块化、灵活、易于维护和扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员学习随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值