首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >低耦合和高凝聚力不是相互依赖的吗?

低耦合和高凝聚力不是相互依赖的吗?
EN

Stack Overflow用户
提问于 2015-04-21 07:00:03
回答 6查看 2K关注 0票数 6

我应该写两个版本的相同的代码。一个是低耦合和高内聚,另一个仍然是低耦合,但这次是低内聚。我真的不明白这有什么区别?我怎么能有低耦合和低内聚力?他们似乎关系密切,这是不可能做到的。

有人能解释一下吗?也许举个例子?谢谢!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-04-23 09:41:54

简而言之:

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

从面向对象的角度来看内聚力的一种方法是,类中的方法是否使用任何私有属性。

现在讨论的范围比这更大,但是高衔接(或者说衔接最好的类型--功能性衔接)是当模块的各个部分被分组时,因为它们都对模块的一个定义明确的任务做出了贡献。

简单地说,耦合是指一个组件(再一次,设想一个类,尽管不一定)对另一个组件的内部工作或内部元素有多少了解,即它对另一个组件有多少知识。

松散耦合是一种将系统或网络中的组件互连起来的方法,使这些组件在实际可行的最小程度上相互依赖(…)。

In long:

我写了一篇关于这个的博文。 --它详细讨论了所有这些问题,并举例说明了为什么要遵循这些原则的好处。我觉得这会有帮助..。

票数 2
EN

Stack Overflow用户

发布于 2015-04-21 16:35:34

耦合和内聚是两种不同的度量的软件模块。

耦合是对如何两类交互的描述。如果两个类相互依赖,则它们呈现紧耦合;如果两个类可以相互独立使用,则显示松散耦合。松散耦合是首选的,因为它有助于可重用组件和高度可维护性。

Cohesion是对的描述,它描述了、单个类的组件是如何结合在一起的。一个包含与彼此无关的方法的类显示了低内聚性;一个包含逻辑相似的方法的类显示了高内聚性。高度的凝聚力导致了目标明确的集中类。

耦合与内聚力是共生的关系。如果两个类是紧密耦合的,那么很有可能它们没有明确的职责,因此会表现出低的内聚力。相反,如果一个类具有高度的内聚性,那么它的目的是定义得很好的,而且它更容易与其他类一起使用,从而避免了与它们的耦合。

对于你的特殊任务,从写“好”代码开始--低耦合和高内聚力。要将其转化为低耦合和低内聚力,请保持类之间的独立性,但要将功能混在一起。使用一大堆无关的方法创建一个实用程序类。将以元音开头的所有方法放到另一个类中。做一些阻止任何类都有明确目标的事情。

只要您不让类相互依赖,您就会创建具有低耦合性但也具有低内聚性的代码。

票数 2
EN

Stack Overflow用户

发布于 2015-04-21 08:50:59

耦合和衔接在某种程度上是两个密切的概念,但并不相同。你的设计应该有:

  1. 低耦合:这意味着您的类不应该依赖其他类(尤指p)。具体的课程)太多了。你必须尽可能地把它们解耦。解耦有助于重用( OO软件工程的目标)。因为当您重用这些类时,您不需要在类中带任何其他类来使其工作。许多设计模式(如Facade )都实现了这一目标。
  2. 高凝聚力:这意味着您的类不应该包含许多不相关的任务。当您增加衔接时,代码理解就变得更容易了,因为这个类正在执行一些连贯的任务。这也增加了可重用性。一些设计模式,比如Visitor,就是有这个目标的。

在“继续”中,我给出了三个可能更有意义的类示例:

代码语言:javascript
复制
#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() { /*...*/ }
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29765088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档