6

我在一次技术面试中被问到一个项目的内聚和耦合。我广泛解释了他们的定义,尽管我没有正确回答问题的第二部分,正如他所说。

“我们如何在一个项目中同时实现高度内聚和松散耦合的设计,请解释如何在单体项目中实施这种方法?”

我回答说这两个目标是矛盾的,所以我们需要为每个项目或模块找出最好的选择,但我无法提供一个全面的答案。

如果有人帮助我,我将不胜感激。

4

3 回答 3

9

我想首先回答说这与您所说的“两个定义是矛盾的”完全相反。我将引用John W. Satzinger System Analysis and Design in a Changeing World, Key Facts book的名言来描述

低耦合通常与高内聚相关,反之亦然


通过在Monolithic中说,他们向您发出信号,询问SOLID 原则,如果您应用它们,将导致高内聚和松散耦合项目。

这是定义:

1.单一职责原则(SRP)

定义:改变班级的理由不应该超过一个。

好处:

  • 班级凝聚力更强
  • 依赖类之间更松散的耦合,
  • 更好的可读性
  • 复杂度较低的代码
  • 代码更易于理解和维护。

2.开闭原则(OCP)

定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。

好处:

  • 松耦合,
  • 提高可读性
  • 降低破坏现有功能的风险
  • 代码可维护和可重用。
  • 代码更健壮。

3. 里氏替换原则(LSP)

定义:程序中的对象应该可以用它们的子类型的实例替换,而不改变该程序的正确性。

好处:

  • 松耦合
  • 代码更可重用。
  • 类层次结构易于理解。

4.接口隔离原则(ISP)

定义: 许多特定于客户端的接口优于一个通用接口

好处:

  • 解耦系统。
  • 代码易于重构。

5.依赖倒置原则(DIP)

定义: 高级模块不应该依赖于低级模块,而两者都应该依赖于抽象。抽象不应该依赖于细节;而细节应该取决于抽象。

好处:

  • 高凝聚力。
  • 减少耦合。
  • 代码更可重用。

更多信息


图书

  • 史蒂夫·麦康奈尔的代码完成
  • 鲍勃叔叔的干净代码
于 2018-09-09T19:10:54.943 回答
2

根据维基百科(https://en.wikipedia.org/wiki/Cohesion_(computer_science)

高内聚通常与松散耦合相关,反之亦然

所以目标是实现高内聚松耦合。要实现它,您需要开发只做一件事的类,将单体项目拆分为几个模块(DAO、UI、业务逻辑)并编程到一个接口,以便其他类(或其他模块)不了解其他类的内部结构类/模块,并且只知道外部合同(接口/API)。

于 2018-09-09T18:31:52.130 回答
2

在阅读您的问题之前,我不熟悉凝聚力的概念。来自维基百科(这里):

具有高内聚性的模块往往更受欢迎,因为高内聚性与软件的几个理想特征相关联,包括健壮性、可靠性、可重用性和可理解性。相比之下,低内聚与不良特征相关,例如难以维护、测试、重用甚至理解。

内聚通常与耦合形成对比,这是一个不同的概念。高内聚通常与松散耦合相关,反之亦然。

我认为您希望每个模块内具有高内聚性和它们之间的松散耦合,这可以通过让模块仅通过简单的抽象接口进行通信来实现。要定义这些接口,您需要设计一个清晰的关注点分离,其中所有紧密耦合的任务都在同一个类中完成,而具有不同粒度的任务(例如高级算法与低级实现细节)被分离出来并由接口抽象出来。

于 2018-09-09T18:34:51.103 回答