35

什么是内聚和解耦?我找到了关于耦合的信息,但没有找到关于解耦的信息。

4

5 回答 5

76

Aaron 的那篇文章很好理解,我也建议你阅读 manning 的出版物Spring in Action这本书,他们给出了很好的例子来说明 spring 如何解决这个问题,它肯定会提高你对此的理解。

编辑 :

我在这本名为“以测试为指导的面向对象的软件成长”的好书中遇到了这一点:

耦合:

如果一个元素的变化会迫使另一个元素发生变化,那么元素就是耦合的。例如,如果两个类继承自一个共同的父类,则一个类的更改可能需要另一个类的更改。想一想组合音频系统:它是紧密耦合的,因为如果我们想从模拟收音机转变为数字收音机,我们必须重建整个系统。如果我们用分离器组装一个系统,它的耦合度会很低,我们可以换掉接收器。“松散”耦合的特征(即低耦合的特征)更容易维护。

凝聚:

一个元素的凝聚力是衡量其职责是否形成一个有意义的单元的指标。例如,解析日期和 URL 的类是不连贯的,因为它们是不相关的概念。想想一台既洗衣服又洗盘子的机器——它不太可能两全其美。2 在另一个极端,一个只解析 URL 中的标点符号的类不太可能是连贯的,因为它不能代表一个完整的概念。为了完成任何事情,程序员必须为协议、主机、资源等寻找其他解析器。具有“高”一致性的特征更容易维护。

于 2010-05-21T11:35:51.287 回答
16

内聚 - 与类/方法应该只负责一件事的原则有关,即没有不属于封装的杂散方法;一个方法只做一件事。高/低凝聚力是这种情况的程度。

耦合 - 系统的不同部分相互依赖的程度。例如,如何以及在何处存在依赖关系。如果两个类调用彼此的方法,那么它们是紧密耦合的,因为改变一个就意味着必须改变另一个。解耦是使紧密耦合的东西变得不那么紧密或根本不紧密耦合的过程。

柔性系统具有高内聚和松散耦合。

于 2010-05-21T11:43:41.250 回答
3

对于耦合,这篇维基百科文章应该回答你所有的问题。本文讨论凝聚力。

“去耦”只是“小/低耦合”的另一个名称。

所以这些术语回答了这些问题:

  • 您项目的每个部分在多大程度上依赖于另一部分?
  • 如果您只想使用项目的一部分(例如解决特定问题),您需要对项目的所有其余部分了解多少?
  • 您项目的每个部分是专注于特定问题的单一解决方案还是将解决方案“泄漏”到其他部分?
于 2010-05-21T11:32:51.210 回答
0

以下是我对凝聚力的看法。想象有一个模块。在该模块中,我们有一些任务。当这些任务彼此高度相关时,我们说它具有高凝聚力。当这些任务不相关时,我们说它具有低凝聚力。我解释解耦的最佳尝试是解耦是消除耦合的行为。

低耦合帮助我们获得高内聚!请记住,我们希望我们的模块具有相关的任务和一个单一的职责。但什么是耦合?耦合是对其他模块的依赖程度,以实现我们对该模块的单一职责。因此,通过低耦合,我们说我们不太依赖外部模块,因此我们具有高内聚性。

但是,如果我们对外部模块有很多依赖,我们就会有高耦合和低内聚。得到它?

其他更多装饰的思想家和团体说:

内聚力是单个模块执行的任务在功能上相关的程度。” IEEE,1983 “内聚力是将模块粘合在一起的“粘合剂”。它可以被认为是模块的组成元素之间的关联类型。一般来说,人们想要尽可能高的凝聚力。”Bergland,1981

如果该单元中的元素表现出高度的功能相关性,则称该软件组件表现出高度的内聚性。这意味着程序单元中的每个元素对于该单元实现其目的都应该是必不可少的。萨默维尔,1989

于 2012-11-05T20:02:37.827 回答
-2

解耦允许将对象交互与类和继承分离到不同的抽象层中,用于多态解耦封装,这是使用可重用代码来防止离散代码模块相互交互的做法。

于 2013-08-25T20:04:48.753 回答