1分钟彻底搞懂“高内聚,低耦合”

目录

1.高内聚低耦合:

2.生活类比理解耦合与内聚

2.1高内聚情况

2.2高耦合情况

2.3低耦合情况

3.程序开发中耦合的影响

3.1高内聚示例

3.2低耦合示例


 

1.高内聚低耦合:


一句话说明,每个模块只管自己的事,并且尽量不依赖其他模块。

两句话说明,具体一点:

高内聚:一个模块集中做好一件事,所有相关的代码都在一起。

低耦合:不同模块之间的联系尽量少,修改一个模块不会影响其他模块。

 

2.生活类比理解耦合与内聚

我们以组装电脑为例,电脑的各个部件(如 CPU、显卡、硬盘、内存条等)就如同程序中的模块,它们之间的连接紧密程度和相互影响情况,就类似于程序模块间的耦合;而每个部件自身功能的专注度则类似于程序模块的内聚。

2.1高内聚情况

在电脑中,每个部件都高度专注于自身的核心功能,展现出高内聚的特性。

CPU(中央处理器):CPU 的核心任务是进行数据运算和逻辑处理。不会参与到如数据存储、图形显示等其他功能中,这体现了高度的内聚性。

显卡(图形处理器):显卡主要负责处理和输出图形图像数据。显卡的驱动程序和软件也都是围绕图形处理进行优化的,不会干扰到 CPU 的计算任务、硬盘的数据存储以及内存条的数据读写等其他功能,各个功能环节紧密围绕图形处理这一核心任务,体现了高内聚。

硬盘:硬盘的主要功能是数据的长期存储。其设计和工作原理都是为了提高数据存储的容量、速度和可靠性,而不会参与到计算机的运算或图形处理等其他功能中,具有很强的内聚性。

内存条(随机存取存储器):内存条的核心作用是暂时存储 CPU 在处理数据时需要用到的信息,起到数据缓存和快速交换的作用。不涉及数据的长期存储、图形处理等其他方面,展现出高内聚的特点。

2.2高耦合情况

假设你拿到一台设计糟糕的电脑,显卡的正常运行高度依赖特定型号的 CPU。一旦 CPU 出现小故障,或者更换为其他型号,显卡就会立马罢工。而且,硬盘的数据传输线路和内存条的数据传输线路相互交织,只要硬盘出问题,内存条的工作很可能也会受到直接影响。在这种情况下,各个部件之间的关系盘根错节,一个部件的变动会像多米诺骨牌一样,对其他部件产生严重影响。这就如同程序模块间的高耦合,在高耦合的程序里,修改一个模块很可能会牵一发而动全身,引发多个相关模块出现问题,让程序的维护和扩展变得异常艰难。

2.3低耦合情况

再看一台设计精良的电脑,每个部件都拥有独立的接口和功能。显卡具有广泛的兼容性,能适配多种型号的 CPU,即便 CPU 出现故障或者更换新的型号,显卡依然可以正常工作。硬盘和内存条的数据传输线路相互独立,硬盘出现问题时,内存条能够不受干扰地继续运行。各个部件之间的依赖关系十分微弱,一个部件的变动对其他部件几乎没有影响。这就和程序模块间的低耦合类似,在低耦合的程序中,每个模块相对独立,开发者修改一个模块时,不容易波及其他模块,大大提高了程序的可维护性和可扩展性。

 

3.程序开发中耦合的影响

高耦合:就像那台设计糟糕的电脑部件一样,程序模块高耦合会使代码变得复杂且脆弱。一旦某个模块需要修改,开发者可能要对与之相关的多个模块都进行调整,这不仅增加了工作量,还容易引入新的错误,大幅提高了开发和维护的成本。

低耦合:当程序模块低耦合时,各个模块独立性强,开发者可以更加便捷地对单个模块进行开发、测试和修改。这不仅提高了开发效率,还让程序具备更强的灵活性和稳定性。

下面我们通过一个简单的计算器程序,用 C 语言代码来进一步解释高内聚低耦合的概念。

3.1高内聚示例

高内聚强调一个模块(这里可以是函数或者一组相关函数)只负责单一且紧密相关的任务。在计算器程序中,我们将不同的运算操作封装到不同的函数中,每个函数专注于一个特定的运算。

// 加法运算函数
int add(int a, int b) {
    return a + b;
}

// 减法运算函数
int subtract(int a, int b) {
    return a - b;
}

// 乘法运算函数
int multiply(int a, int b) {
    return a * b;
}

// 除法运算函数
int divide(int a, int b) {
    if (b == 0) {
        // 处理除数为0的情况
        return -1; 
    }
    return a / b;
}

每个函数都专注于一项特定的运算,例如 add 函数只进行加法运算,subtract 函数只进行减法运算。函数内部的代码都紧密围绕单一的功能展开,这就是高内聚的体现。如果要修改加法运算的逻辑,只需要在 `add` 函数内部进行修改,不会对其他运算函数产生影响。

3.2低耦合示例

低耦合意味着模块之间的依赖关系要尽可能简单和松散。我们编写一个函数来调用上述的运算函数,并且让这个调用函数和具体的运算函数之间的关联尽量简单。

#include 
// 根据操作符调用相应的运算函数
int perform_operation(int a, int b, char op) {
    switch (op) {
        case '+': return add(a, b);
        case '-': return subtract(a, b);
        case '*': return multiply(a, b);
        case '/': return divide(a, b);
        default: return -1; // 处理无效操作符
    }
}


int main() {
    int num1 = 10, num2 = 5;
    char operation = '+';
    
    int result = perform_operation(num1, num2, operation);
    printf("运算结果: %d\n", result != -1 ? result : "无效的运算或操作符");
    return 0;
}

perform_operation函数负责根据传入的操作符调用相应的运算函数,它并不关心每个运算函数内部是如何实现的,只需要知道每个运算函数的输入(两个整数)和输出(运算结果)。这体现了低耦合,因为如果后续要修改 add 函数的实现,只要保持函数的输入输出接口不变,perform_operation 函数不需要做任何修改。

综上所述,高内聚让每个函数功能单一明确,低耦合让函数之间的关联简单松散,这样的代码结构更易于维护和扩展,是我们在程序开发中应该追求的目标。

 

 

你可能感兴趣的:(C语言,方法,算法,stm32,嵌入式硬件,单片机)