在一次技术采访中,我被问到一个项目的凝聚力和耦合性。正如他所说,尽管我没有正确回答问题的第二部分,但我对它们的定义进行了广泛的解释。
“我们如何在一个项目中同时实现高度凝聚力和松散耦合的设计,请解释如何在整体项目中实现这种方法?”
我回答说这两个目标是矛盾的,因此我们需要找出每个项目或模块的最佳选择,但是我无法提供全面的答案。
如果有人帮助我,我将不胜感激。
答案 0 :(得分:8)
我首先要回答,这与您所说的“两个定义是矛盾的”完全相反。我将通过引用 John W. Satzinger在不断变化的世界中进行系统分析和设计,关键事实书
来引述低耦合通常与高内聚性相关,反之亦然
在 Monolithic 中说,他们是在向您询问有关 SOLID主体的问题,如果您应用它们,将导致高内聚力和松散的耦合项目。
这是定义:
定义:更改类的理由不应该超过一个。
好处:
定义:软件实体(类,模块,功能等)应打开以进行扩展,但应关闭以进行修改。
优点:
定义:程序中的对象应可替换为其子类型的实例,而不会改变该程序的正确性。
优点:
定义:许多特定于客户端的界面要优于一个通用界面
优点:
定义:高级模块不应依赖于低级模块,而两者均应依赖于抽象。抽象不应该依赖细节。相当的细节应该取决于抽象。
优点:
更多信息
书籍
答案 1 :(得分:1)
根据Wikipedia(https://en.wikipedia.org/wiki/Cohesion_(computer_science))
高内聚性通常与松散耦合相关,反之亦然
因此目标是实现高凝聚力和松散耦合。 要实现它,您需要开发仅做一件事的类,将整体项目分成几个模块(DAO,UI,业务逻辑)并编程到一个接口,以便其他类(或其他模块)不了解其他内部组件。类/模块,并且只知道外部合同(接口/ API)。
答案 2 :(得分:1)
在阅读您的问题之前,我对凝聚力的概念并不熟悉。来自维基百科(here):
具有高内聚力的模块往往是优选的,因为高 凝聚力与软件的一些理想特性有关 包括健壮性,可靠性,可重用性和可理解性。 相反,低内聚性与不良特性有关,例如 因为难以维护,测试,重用甚至理解。
凝聚力通常与耦合(一种不同的概念)形成对比。高 内聚力通常与松散耦合有关,反之亦然。
我认为您希望每个模块之间具有较高的内聚性,并使它们之间的耦合松散,这可以通过使模块仅通过简单的抽象接口进行通信来实现。要定义这些接口,您将需要设计一个清晰的关注点分离,其中所有紧密耦合的任务都在同一个类中完成,而粒度不同的任务(例如,高级算法与低级实现细节)被分离出来,通过接口抽象掉。