软件工程中的内聚与耦合

2025 年 5 月 13 日 | 阅读 6 分钟

引言

软件系统的设计和评估在很大程度上依赖于内聚和耦合的概念。它们描述了软件系统中模块或组件的排列和通信。构建具有弹性、可伸缩性和可维护性的软件应用程序需要对内聚和耦合的理解。

内聚与耦合简介

在软件工程中,耦合与内聚塑造了设计可管理且高效软件组件的艺术,即模块化。

耦合定义了模块的相互依赖性,而内聚衡量了组件的统一性。实现高内聚和低耦合可以促进易于理解和维护的模块化结构。通过驾驭复杂性,开发人员可以提高测试、可伸缩性和团队协作能力,从而实现互利共赢。这些指导原则影响着整个软件生命周期中的客户满意度和项目管理。

模块耦合

在软件工程中,耦合是指软件模块之间的相互依赖程度。两个紧耦合的模块高度依赖于对方。然而,两个松耦合的模块之间没有相互依赖性。无耦合模块之间完全没有相互依赖性。

耦合技术的各种类型如图所示

Coupling and Cohesion

好的设计是耦合度低的设计。耦合度通过模块之间的关系数量来衡量。也就是说,随着模块之间调用次数的增加或共享数据的量很大,耦合度会增加。因此,可以认为高耦合的设计会产生更多错误。

模块耦合的类型

Coupling and Cohesion

1. 无直接耦合:M1 和 M2 之间没有直接耦合。

Coupling and Cohesion

在这种情况下,模块从属于不同的模块。因此,没有直接耦合。

2. 数据耦合:当一个模块的数据传递给另一个模块时,这称为数据耦合。

Coupling and Cohesion

3. 印记耦合:如果两个模块通过复合数据项(如结构、对象等)进行通信,则它们是印记耦合的。当模块将非全局数据结构或整个结构传递给另一个模块时,它们被认为是印记耦合的。例如,在 C 语言中将结构变量传递给模块,或在 C++ 语言中将对象传递给模块。

4. 控制耦合:当一个模块的数据用于指导另一个模块的指令执行结构时,会发生两个模块之间的控制耦合。

5. 外部耦合:当两个模块共享外部强制的数据格式、通信协议或设备接口时,会产生外部耦合。这与与外部工具和设备的通信有关。

6. 公共耦合:如果两个模块通过某些全局数据项共享信息,则它们是公共耦合的。

Coupling and Cohesion

7. 内容耦合:如果两个模块共享代码,例如一个模块分支到另一个模块,则它们之间存在内容耦合。

模块内聚

在计算机编程中,内聚是指模块元素彼此归属的程度。因此,内聚衡量了给定模块内功能片段之间的关系强度。例如,在高度内聚的系统中,功能是紧密相关的。

内聚是一种有序测量类型,通常被描述为“高内聚”或“低内聚”。

Coupling and Cohesion

模块内聚的类型

Coupling and Cohesion
  1. 功能内聚:如果一个模块的不同元素协同工作以实现一个单一功能,则称之为功能内聚。
  2. 顺序内聚:如果一个模块的元素构成序列的组成部分,其中一个组件的输出是下一个组件的输入,则该模块具有顺序内聚。
  3. 通信内聚:如果一个模块的所有任务都引用或更新相同的数据结构(例如,在一组数组或堆栈上定义的一组函数),则该模块具有通信内聚。
  4. 过程内聚:如果模块的一组目的是一个过程的组成部分,该过程必须按照特定的步骤执行以实现一个目标,则该模块被认为是过程内聚的(例如,解码消息的算法)。
  5. 时间内聚:当一个模块包含因所有方法必须在同一时间执行而关联起来的功能时,该模块被认为表现出时间内聚。
  6. 逻辑内聚:如果一个模块的所有元素执行类似的操作,则该模块被认为是逻辑内聚的。例如,错误处理、数据输入和数据输出等。
  7. 偶然内聚:如果一个模块执行一组任务,这些任务之间几乎没有或根本没有关联,则该模块具有偶然内聚。

内聚与耦合的区别

Coupling and Cohesion
方面耦合内聚
定义系统模块或组成部分之间的相互依赖程度。模块或组件之间关注点和相关性的程度。
重点模块之间的交互。构成模块的元素。
对变更的影响一个模块的更改可能会影响其他模块。修改被限制在模块内部。
灵活性由于高耦合的变更可能性很大,降低了系统的灵活性。由于变更被局部化,高内聚提高了系统的灵活性。
维护由于频繁的变更,高耦合使维护更加困难。由于变更受限,高内聚使维护更容易。
测试隔离和测试耦合模块更困难。内聚模块的功能包含良好,测试它们更简单。
重用由于依赖关系,耦合模块的可重用性较低。内聚模块清晰且目标明确的功能使其更具可重用性。
依赖性耦合表示模块的依赖性。内聚代表模块的目的和统一性。
设计目标为了减少相互依赖性,请致力于低耦合。为了使模块清晰且专注,请致力于高内聚。
目的为了系统稳定,请最小化依赖性和交互。为完成明确目标而进行的元素分组。
系统影响高耦合可能导致级联故障和僵化的架构。高内聚鼓励适应性强的架构和可维护性。

结论

内聚和耦合是软件工程的基本概念,它们对软件系统的质量和可维护性有很大影响。强大的模块内聚保证了专注、明确的功能,有助于代码的理解、测试和维护。

通过结合低耦合和高内聚,可以获得更具适应性、弹性且易于更改的系统。一个设计良好的软件系统通过在耦合和内聚之间取得和谐平衡,实现了可维护性、可重用性和长期成功。通过理解和实践这些原则,软件工程师可以创建不仅功能强大,而且足够灵活以适应不断变化的用户需求和技术突破的系统。

常见问题

1. 软件开发中的耦合与内聚有何区别?

软件系统的内聚是指其组件互连并协作以实现共享目标的程度。相反,耦合描述了各种软件系统模块或组件之间的相互依赖程度。

2. 内聚对软件系统的整体质量有何影响?

当软件系统具有高内聚时,其组件相互关联,并协同工作以实现共同目标。这使得代码更易于维护、重用和理解。它使得软件系统更容易测试和修改,从而提高了其整体质量。

3. 高耦合对软件设计有何影响?

在设计软件时,高耦合会产生多种影响。它使得理解、修改和维护系统更加困难。由于它可能会影响其他紧耦合的模块,因此更改一个模块会增加意外副作用的可能性。它还会降低代码的灵活性和可重用性。

4. 能否举例说明低耦合和高内聚的软件开发场景?

一个仅处理用户身份验证并包含登录、注销和密码重置功能的模块是高内聚的例子。两个模块通过清晰定义的接口进行通信,其中一个模块的更改不需要更改另一个模块,这是低耦合的例子。

5. 我们如何衡量软件系统的耦合和内聚程度?

可以使用多种指标来评估软件系统的耦合和内聚程度。CAM(方法内聚)和 LCOM(方法内聚不足)是可用于量化内聚度的两个指标。CBO(对象间耦合)和 RFC(类的响应)是可用于量化耦合度的两个指标。