当前位置: 首页 > 知识库问答 >
问题:

高内聚力和松耦合的优化

韩朝斑
2023-03-14

在一次技术采访中,我被问及项目的凝聚力和耦合性。我详细解释了它们的定义,尽管我没有像他说的那样正确回答问题的第二部分。

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

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

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

共有3个答案

张和豫
2023-03-14

在阅读你的问题之前,我不熟悉衔接的概念。来自维基百科(此处):

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

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

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

暴辰龙
2023-03-14

根据维基百科(https://en.wikipedia.org/wiki/Cohesion_(计算机科学)

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

因此,目标是实现高内聚和松耦合。为了实现这一点,您需要开发只做一件事的类,将整体项目分成几个模块(DAO、UI、业务逻辑),并编程到一个接口,这样其他类(或其他模块)就不知道任何关于其他类/模块内部的事,只知道外部契约(接口/API)。

滕学义
2023-03-14

首先,我想说,这与你所说的“这两个定义是矛盾的”完全相反。我将引用约翰·萨特辛格在《变化世界中的系统分析和设计,关键事实》一书中的话来描述

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

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

以下是定义:

定义:一个类改变的原因不应该超过一个。

好处:

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

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

好处:

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

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

好处:

  • 松耦合

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

好处:

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

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

好处:

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

更多信息

  • https://android.jlelse.eu/solid-principles-the-definitive-guide-75e30a284dea

书籍

  • 史蒂夫·麦康奈尔的代码完整
 类似资料:
  • 假设方法和的责任密切相关 第一个例子: 如果 •和在class中定义(因此class具有高度的内聚性) •类别使用和类别使用 然后 •与和类耦合 •更改的签名只需要更改,而不需要更改 第二个例子: 如果 •在类中定义(因此与耦合) •用类定义(因此与耦合) 然后 •更改的签名只需要更改,而不需要更改 a) 据我所知,上一个例子中的类与第一个例子中的类并不耦合!还是我错过了什么? b) 据我所知,第

  • 本文向大家介绍什么是耦合和凝聚力?相关面试题,主要包含被问及什么是耦合和凝聚力?时的应答技巧和注意事项,需要的朋友参考一下 组件之间依赖关系强度的度量被认为是耦合。一个好的设计总是被认为具有高内聚力和低耦合性。 面试官经常会问起凝聚力。它也是另一个测量单位。更像是一个模块内部的元素保持结合的程度。 必须记住,设计微服务的一个重要关键是低耦合和高内聚的组合。当低耦合时,服务对其他服务的依赖很少。这样

  • 有人能帮我吗,我读了一些Java紧耦合和松耦合的文章。我看了好几段YouTube视频和文章,对松散耦合有一定的怀疑,但仍然无法理解某些要点。我会解释我所理解的和让我困惑的。 在松散耦合中,我们限制类之间的直接耦合。但在紧密耦合中,我们注定要去上课。让我们举个例子。我有一个主类和另一个名为Apple的不同类。我在Main类中创建了这个类的一个实例 让我们看看松耦合 如果我将松散耦合中的方法签名从“喝

  • 我在理解语句。我已经在谷歌上搜索并阅读了很多关于这方面的内容,但仍然觉得很难理解。 据我所知,高内聚意味着我们应该有专门的类来执行特定的功能。希望这是正确的?就像信用卡验证类一样,它专门用于验证信用卡。 还不明白低耦合是什么意思?

  • 我应该写两个版本的相同代码。一个具有低耦合和高内聚,另一个仍然具有低耦合,但这次具有低内聚。我真的不明白有什么区别?我怎么可能有低耦合和低内聚?它们似乎如此相关,以至于这是不可能做到的。 有人能解释一下吗?也许用一个例子?谢谢。

  • 目前,我将进一步介绍java类,这是该类如何简要定义的: 内聚:以高内聚为目标,在这种情况下,内聚意味着单个模块紧紧关注其任务。 耦合:以低耦合为目标,在这种情况下,耦合意味着两个或多个模块相互交织的程度。 如何确定凝聚力和耦合度的水平? 例如,我的一些方法调用了同一类中的其他方法。这意味着调用其他方法的方法依赖于其他方法,以便“调用”方法完成其代码块。这是否意味着我对同一类的方法具有低内聚和高耦