"低耦合和高内聚"意味着什么

use*_*906 135 oop ooad

我在理解声明时遇到了问题low in coupling and high in cohesion.我用Google搜索并阅读了很多相关信息,但仍然难以理解.

根据我的理解High cohesion,我们应该拥有专门用于执行特定功能的类.希望这是正确的吗?就像信用卡验证类一样,专门用于验证信用卡.

还是不明白低耦合意味着什么?

vis*_*aim 210

我相信这是:

内聚是指模块/类的元素在一起的程度,建议相关代码应该彼此接近,因此我们应该争取高内聚并尽可能地将所有相关代码绑定在一起.它与元素做的模块/类.

耦合是指不同模块/类彼此依赖的程度,建议所有模块尽可能独立,这就是低耦合的原因.它与不同模块/类之间的元素有关.

想象整个图片将有所帮助:

在此输入图像描述

截图来自Coursera.

  • 我们的教授说:"高凝聚力是关于确保模块不做很多事情,它只是做一件特别的事情". (19认同)
  • 该图表意味着什么都没有. (9认同)
  • @Lokesh我认为你的评论混淆了事情.你的教授将"高度凝聚力"与"单一责任原则"混为一谈.高凝聚力意味着将类似和相关的事物保持在一起.您可以在由许多功能组成的对象或服务中具有高内聚力. (5认同)
  • 在微服务架构方面,高内聚意味着强相关的东西应该放在一个微服务中,松耦合意味着微服务本身应该是细粒度的,以便在有界上下文中工作,即独立做一件事。 (4认同)
  • 从我认为它更像是"确保一个模块做一件事,没有多少模块做同样的事情",通过这个你可以确保只有一个模块指定行为,所以事物的整体行为是凝聚力的. (2认同)

The*_*yan 38

软件工程中的凝聚力,就像在现实生活中一样,整体构成的元素(在我们的例子中,我们说是一个类)可以说它们实际上属于一个整体.因此,它是衡量软件模块的源代码所表示的每个功能的强烈关系的度量.

根据OO观察内聚的一种方法是,如果类中的方法使用任何私有属性.

现在讨论比这更大但是高凝聚力(或凝聚力的最佳类型 - 功能凝聚力)是模块的一部分被分组,因为它们都有助于模块的单个明确定义的任务.

耦合用通俗的话说,是多少一个组件(再次,想象一类,虽然不一定)知道的内部运作或另外一个内部元素,也就是说,它多少知识有其他成分的.

松耦合是一种互连系统或网络中的组件的方法,以便这些组件在实际可能的最小程度上相互依赖...

我写了一篇关于此的博客文章.它通过示例等详细讨论了所有这些内容.它还解释了为什么要遵循这些原则的好处.


zor*_*ran 21

在软件设计中,高凝聚力意味着课程应该做好一件事,一件事.高凝聚力与单一责任原则密切相关.

低耦合表明类应该具有最少的可能依赖性.此外,必须存在的依赖关系应该是弱依赖关系 - 更喜欢依赖于接口而不是依赖于具体类,或者更喜欢组合而不是继承.

高内聚和低耦合为我们提供了更易于维护的更好设计代码.


小智 10

当我阅读有关微服务的内容时。我遇到了以下事情:

在此输入图像描述

内聚性是对组件各部分之间的关​​系数量的度量。高内聚意味着交付组件功能所需的所有部分都包含在组件中

耦合是对系统中一个组件与其他组件之间的关系数量的度量。低耦合意味着组件与其他组件没有太多关系


小智 9

低耦合是在两个或多个模块的上下文中.如果一个模块的变化导致其他模块发生很多变化,那么就会说它们是高度耦合的.这是基于接口的编程有用的地方.模块内的任何更改都不会影响其他模块,因为它们之间的接口(交互的平均值)没有改变.

高凝聚力 - 把类似的东西放在一起.因此,一个班级应该有相关工作的方法或行为.举一个夸张的坏例子:List接口的实现不应该有与String相关的操作.String类应该有方法,字段与String相关,同样,List的实现应该有相应的东西.

希望有所帮助.


Dan*_*ník 9

简短而明确的答案

  • 高内聚性:一个类/模块中的元素应该在功能上属于一个并做一件特别的事情.
  • 松耦合:在不同的类/模块中应该是最小的依赖.


KJ *_*han 6

以旧电脑主板为例。

  • 鼠标有自己的 PS/2 端口。
  • 打印机有自己的打印机端口。
  • 显示器有自己的 VGA 端口。

这意味着特定端口仅适用于特定设备,而不适用于其他设备。

这是强/高耦合

由于鼠标仅用于操作光标和相关功能,键盘用于键入按键等,即它们仅执行其预期的任务,因此这是高内聚

如果鼠标有几个按钮 'a' 'b' 'c' 需要输入,那么它所做的就超出了它应该做的,因为键盘已经在执行它们,这是低内聚

值得庆幸的是,过时的专用端口已被我们称为USB 的标准(接口)所取代。这是松散/低耦合的

看看这些物理属性,很明显这就是它应该的样子,但是在编写软件时,很容易忘记什么功能要放在哪里等等,因此提醒一下,在所有内容中生活中,始终坚持:

“高内聚和松耦合”


Dav*_*dio 6

打个比方,如果你的猫吠叫,那么它的凝聚力很差,而如果你的狗需要一只猫在他身边吠叫,那么它的耦合度很高

“狗会叫,猫会咕噜咕噜叫,如果它们呕吐,你的 Pull 请求将被拒绝”

  • 这应该是最好的答案! (2认同)

won*_*all 5

长话短说,低耦合,因为我理解它意味着组件可以换出而不影响系统的正常运行.Basicaly将您的系统模块化为可以单独更新的功能组件,而不会破坏系统


小智 5

凝聚力——一切事物之间的联系有多紧密。
耦合- 一切如何相互连接。

让我们举个例子——我们想设计一辆自动驾驶汽车。

(1) 我们需要电机正常运行。

(2) 我们需要汽车自己开车。

(1) 启动电机并使其运行中的所有类和函数都可以很好地协同工作,但不能帮助汽车转向。所以我们将这些类放在引擎控制器之后。

(2) 中的所有类和函数都可以很好地使汽车转向、加速和制动。它们不帮助汽车启动或向活塞输送汽油。所以我们把这些类放在它自己的驾驶控制器后面。

这些控制器用于与所有可用的类和函数进行通信。控制器然后仅彼此通信。这意味着我不能从油门类调用活塞类中的函数来使汽车跑得更快。

踏板类必须要求驾驶控制器与引擎控制器交谈,然后引擎控制器告诉活塞类走得更快。这使我们程序员能够发现问题,并允许我们组合大型程序而无需担心。这是因为代码都在控制器后面工作。