【软件工程】内聚和耦合的区别
视频号
微信公众号
知识星球
1.简介
内聚和耦合是设计模块化软件系统中常见的概念。它们由Larry Constantine在20世纪60年代末开发,已被证明是从软件设计到软件度量等领域的基础。它们后来成为标准术语。
在本教程中,我们将研究内聚和耦合,以及它们如何相互关联。
2.凝聚力
内聚性是一个模块内的元素属于一起的程度。模块可以是一个类、一个包,甚至是一个微服务。简单地说,它的意思是“一起改变的代码,保持在一起”。
具有高内聚性的模块包含彼此紧密相关并在其目的上统一的元素。例如,User类中的所有方法都应该表示用户行为。
如果一个模块包含不相关的元素,则称其内聚性较低。例如,User类包含一个关于如何验证电子邮件地址的方法。用户类可以负责存储用户的电子邮件地址,但不负责验证或发送电子邮件:
这应该属于其他类,比如电子邮件。
正如你所看到的,内聚的概念与单一责任原则(SRP,SOLID原则之一)密切相关,该原则规定一个类应该只有一个责任。SRP之后的模块可能具有高内聚性。
2.1高内聚性的优点
具有单一、定义明确的目的的模块易于理解,可读性更强。这些模块的名称清楚地表明了它们的目的,而这些模块正是这样做的。它有助于读者在不阅读模块中的每一行的情况下建立对模块正在做什么的直觉。此外,在阅读这些模块的代码时也不会感到意外。
例如,如果User类包含用于验证电子邮件地址的代码,读者会感到困惑。
由于所有相关的代码都在模块中,因此更改代码更容易。例如,如果开发人员必须对用户行为进行更改,他们可以跳到user类并在一个类中进行所有更改。这将限制影响范围。将此与用户行为分布在多个类中并且每个类都必须进行更改以实现所需更改的设计进行比较。
测试代码更容易。由于此类模块的目的不依赖于其他模块,因此它们很容易进行单元测试。此外,当更改仅限于单个模块时,构建和部署更改也很容易。
对此类模块的更改不太容易出现错误。跨模块进行更改时更容易出错。
最后,它们是可重复使用的。由于此类模块履行单一职责,因此往往会在有此类需求的地方使用。
总的来说,高度内聚的模块反映了更好的软件设计质量。因此,在模块中查找与主要目的没有直接关系的元素。将它们移到更符合目的的其他模块或创建一个新模块。
3.耦合
耦合是指软件模块之间的相互依赖程度。模块可以是一个类、一个包,甚至是一个微服务。实际上,耦合是关于改变一件事需要改变另一件事。
如果两个模块紧密连接,则具有高度耦合(或紧密耦合)。例如,两个具体的类存储对彼此的引用并调用彼此的方法。如下图所示,Customer和Order是紧密耦合在一起的。Customer存储客户下的所有订单的列表,而Order存储对Customer对象的引用。
每次客户下新订单时,我们都需要将其添加到客户内部的订单列表中。这似乎是一种不必要的依赖。此外,Order只需要知道客户标识符,并且确实需要对customer对象的引用。通过进行以下更改,我们可以使这两个类松散耦合:
它们之间具有低耦合的模块大多彼此独立地工作。
3.1低耦合的优点
松散耦合的模块更易于开发和维护。由于它们相互独立,我们可以并行开发和测试它们。此外,它们可以在不相互影响的情况下进行修改和更新。我们可以独立构建和部署此类模块,大大缩短了部署时间。
紧密耦合的模块很难更换。开发人员需要了解多个模块以及它们之间的关系。他们需要谨慎地对所有模块进行一致的更改。这使得它更容易出错。此外,我们需要构建、测试和部署每个更改后的模块,从而进一步增加开发工作量。
紧密耦合的模块也很难测试。单元测试单个模块是困难的,因为它严重依赖于其他模块。必须花费大量精力来模拟对其他模块的调用,以便对模块进行独立的单元测试。
集成测试也很难设置。总的来说,测试是脆弱的,因为任何一个模块的变化都可能破坏测试。调试这样的模块也很复杂,因为它需要运行所有依赖的模块。
紧密耦合的模块不太可能被重用。这样的模块本身不执行任何有用的操作。因此,它很少适合其他人重复使用。此外,将其作为依赖项也很困难,因为它会带来其他依赖模块。
整体松耦合反映了软件设计的更高质量。因此,我们应该致力于设计尽可能独立的模块。
4.内聚与耦合
内聚和耦合是相互关联的。每一个都可以影响另一个的级别。
高内聚力与松散耦合相关。一个模块的元件彼此紧密相关,并用于单一目的,该模块将很少交互并依赖于其他模块。因此,将与其他模块松耦合。
类似地,紧密耦合可能是低内聚性的标志。由于元件分布在两个模块之间,模块之间可能存在严重的相互依赖关系。因此,将具有低内聚性。
以下是内聚和耦合之间的快速比较表:
- 162 次浏览