高内聚和松散耦合的优化

时间:2018-09-09 18:23:57

标签: java oop loose-coupling cohesion

在一次技术采访中,我被问到一个项目的凝聚力和耦合性。正如他所说,尽管我没有正确回答问题的第二部分,但我对它们的定义进行了广泛的解释。

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

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

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

3 个答案:

答案 0 :(得分:8)

我首先要回答,这与您所说的“两个定义是矛盾的”完全相反。我将通过引用 John W. Satzinger在不断变化的世界中进行系统分析和设计,关键事实

来引述
  

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


Monolithic 中说,他们是在向您询问有关 SOLID主体的问题,如果您应用它们,将导致高内聚力和松散的耦合项目。

这是定义:

1。单一职责原则(SRP)

定义:更改类的理由不应该超过一个。

好处:

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

2。开闭原理(OCP)

定义:软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改。

优点:

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

3。 Liskov替代原理(LSP)

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

优点:

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

4。接口隔离原理(ISP)

定义:许多特定于客户端的界面要优于一个通用界面

优点:

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

5。依赖倒置原则(DIP)

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

优点:

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

更多信息


书籍

  • 史蒂夫·麦康奈尔的代码完成
  • 鲍勃叔叔的干净密码

答案 1 :(得分:1)

根据Wikipedia(https://en.wikipedia.org/wiki/Cohesion_(computer_science)

  

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

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

答案 2 :(得分:1)

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

  

具有高内聚力的模块往往是优选的,因为高   凝聚力与软件的一些理想特性有关   包括健壮性,可靠性,可重用性和可理解性。   相反,低内聚性与不良特性有关,例如   因为难以维护,测试,重用甚至理解。

     

凝聚力通常与耦合(一种不同的概念)形成对比。高   内聚力通常与松散耦合有关,反之亦然。

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

相关问题