我应该编写相同代码的两个版本。一个具有低耦合和高内聚力,另一个具有低耦合,但这次具有低内聚力。我真的不明白它的区别是什么?我怎样才能具有低耦合和低内聚力?他们似乎很相关,这是不可能做到的。
有人可以解释一下吗?也许有一个例子? 谢谢!
答案 0 :(得分:2)
简而言之:
软件工程中的凝聚力,就像在现实生活中一样,整体构成的元素(在我们的例子中,我们说是一个类)可以说它们实际上属于一个整体。因此,它是衡量软件模块源代码表示的每个功能的强烈关系的度量。
根据OO观察内聚的一种方法是,如果类中的方法使用任何私有属性。
现在讨论比这更大但是高凝聚力(或凝聚力的最佳类型 - 功能凝聚力)是模块的某些部分被分组,因为它们都有助于模块的单个明确定义的任务。
简单地说,一个组件(再次,想象一个类,虽然不一定)知道另一个组件的内部工作或内部元素,即它对另一个组件有多少知识。
松散耦合是一种互连系统或网络中组件的方法,以便这些组件在实际可能的最小程度上相互依赖...
长期:
I wrote a blog post about this.它通过示例等详细讨论了所有这些内容。它还解释了为什么要遵循这些原则的好处。我认为这可能会有所帮助......
答案 1 :(得分:1)
内聚和耦合是您整理项目的属性。
让我们举个实例。现在假设你有棒球,网球,板球,槌球,长曲棍球和台球。假设你还有一个棒球棒,网球拍,板球棒,槌球槌,曲棍球棒和台球杆。如果你将这12个物体随机分成6个袋装对象,你可能会有一个低耦合和低内聚的组织。具体来说,假设包含六个包:
这个组织内聚力低,因为每个包中的物品都是无关的。这个组织有适度的耦合,因为不同包的内容之间的关系密度是中等的(但意大利面条) - 六个链接(每个运动球 - 球对一个)可能21。如果你想要一个偶数的例子较低的耦合你可以从更多的运动对象开始
明显将物品组织成袋子
具有更低的耦合(零耦合),因为没有任何袋子内容与其他袋子的内容有关。它具有很高的凝聚力,因为袋子里的内容是相互关联的。
答案 2 :(得分:0)
例如,假设您有两个类,只有两个类都存在时才会起作用。类中功能的相似性称为内聚,事物如何组合在一起,但它们如何相互作用称为耦合。
因此,如果您编写的程序具有低耦合和高内聚性,则意味着程序的类易于使用和重用,并且类的内部属于一起。所以这些类充满了显示相似性的方法。
通过这种方式,无需在多个位置更改整个代码,即可轻松更改程序的一部分。因此,耦合通常是描述实现的容易程度或难度的术语,并且使用内聚来测量类中方法之间的相似性。因此,如果你想构建具有低耦合和低内聚的东西,你将不得不构建一些易于实现到程序中的东西,但是会混淆封装。
答案 3 :(得分:0)
耦合和凝聚力在某种程度上是两个接近的概念但不一样。你的设计应该有:
低耦合:这意味着您的课程不应过多依赖其他课程(尤其是具体课程)。你必须尽可能地分开它们。解耦有助于重用(OO软件工程的目标)。因为当您重复使用这些课程时,您不需要将任何其他课程与您的课程一起使用。许多设计模式(如Facade
)都可以实现此目标。
高凝聚力:这意味着您的班级不应包含许多不相关的任务。当你增加凝聚力时,代码理解变得更容易,因为类正在做一些连贯的任务。这也增加了可重用性。某些设计模式(例如Visitor
)具有此目标。
继续,我给出了可能更有意义的3个例子:
#include <Document>
#include <Printer>
#include <SpellCheker>
class HighCoupling{
// This class need other class to be usable
Document *doc;
Printer *activePrinter;
CretaeDocument() { /*...*/ }
SaveDocument() { /*...*/ }
PrintDocument() { /*...*/ }
CheckSpell() { /*...*/ }
};
#include <Document>
class LowCouplingHighCohesion {
// This class don't need other classes
// This class is a specialist on some task
CretaeDocument() { /*...*/ }
SaveDocument(Format *) { /*...*/ }
LoadDocument() { /*...*/ }
};
#include <Document>
class LowCouplingLowCohesion {
// This class don't need other classes
// This class do many unrelated things
CretaeDocument() { /*...*/ }
SaveDocument() { /*...*/ }
OpenDocument() { /*...*/ }
Undo() { /*...*/ }
ChangeDocumentBackground() { /*...*/ }
SearchInDocument() { /*...*/ }
};
答案 4 :(得分:0)
耦合和凝聚力是两个不同的度量的软件模块。
耦合是两个类如何互动的说明。如果两个类彼此相互依赖,则它们表现出紧耦合;如果两个类可以彼此独立使用,它们会表现出松散耦合。松散耦合是首选,因为它适用于可重复使用的组件和高可维护性。
Cohesion 是 单一类的组件如何组合的说明。包含彼此无关的方法的类表现出低内聚;包含逻辑相似的方法的类表现出高内聚。高凝聚力导致专注的课程,为明确的目的服务。
耦合与凝聚之间的关系是共生的。如果两个类紧密耦合,那么他们很可能没有明确的责任,因此表现出低凝聚力。相反,如果一个类具有高度内聚性,那么它的目的是明确定义的,并且更容易与其他类一起使用,避免与它们耦合。
对于您的特定任务,首先要编写“好”代码 - 低耦合和高内聚。为了将其转换为具有低耦合和低内聚力的东西,保持这些类彼此独立,但改变其功能。使用一大堆不相关的方法创建一个Utility类。将所有以元音开头的方法放入另一个类中。 某些会阻止任何类具有明确定义的目的。
只要你让这些类不依赖于彼此,你就会创建具有低耦合但内聚力低的代码。
答案 5 :(得分:-1)
区别在于意义。
耦合是指具有否定含义的内容。因此,根据SOLID规则,您必须尝试以这种方式构建应用程序,即松散耦合。 例如,Gof patterns(例如,抽象工厂)和DI containers(例如.NET世界中的MS Unity或NInject)可以帮助您实现这一目标。 松散耦合代码意味着如果您需要在应用程序中插入新类(或者,让我们以这种方式说 - 如果您需要将一个类更改为另一个类),那么您可以轻松地完成它而无需大量工作。 / p>
Cohesion 指的是具有正面含义的内容。所以,正如您可能猜到的那样,您必须尝试以这种方式构建应用程序,它将实现高内聚。这是什么意思?它指的是应用程序的不同模块之间的交互。 例如,我们假设您的应用有两个模块:
如果导入模块可以成功导入导出模块导出的几乎所有内容,那么这意味着您在它们之间建立了良好的交互,并且它们之间的内聚力很高。
答案 6 :(得分:-2)
它们是相反的,低耦合=高内聚。