我在一次技术面试中被问到一个项目的内聚和耦合。我广泛解释了他们的定义,尽管我没有正确回答问题的第二部分,正如他所说。
“我们如何在一个项目中同时实现高度内聚和松散耦合的设计,请解释如何在单体项目中实施这种方法?”
我回答说这两个目标是矛盾的,所以我们需要为每个项目或模块找出最好的选择,但我无法提供一个全面的答案。
如果有人帮助我,我将不胜感激。
我在一次技术面试中被问到一个项目的内聚和耦合。我广泛解释了他们的定义,尽管我没有正确回答问题的第二部分,正如他所说。
“我们如何在一个项目中同时实现高度内聚和松散耦合的设计,请解释如何在单体项目中实施这种方法?”
我回答说这两个目标是矛盾的,所以我们需要为每个项目或模块找出最好的选择,但我无法提供一个全面的答案。
如果有人帮助我,我将不胜感激。
我想首先回答说这与您所说的“两个定义是矛盾的”完全相反。我将引用John W. Satzinger System Analysis and Design in a Changeing World, Key Facts book的名言来描述
低耦合通常与高内聚相关,反之亦然
通过在Monolithic中说,他们向您发出信号,询问SOLID 原则,如果您应用它们,将导致高内聚和松散耦合项目。
这是定义:
定义:改变班级的理由不应该超过一个。
好处:
定义:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
好处:
定义:程序中的对象应该可以用它们的子类型的实例替换,而不改变该程序的正确性。
好处:
定义: 许多特定于客户端的接口优于一个通用接口
好处:
定义: 高级模块不应该依赖于低级模块,而两者都应该依赖于抽象。抽象不应该依赖于细节;而细节应该取决于抽象。
好处:
更多信息
图书
根据维基百科(https://en.wikipedia.org/wiki/Cohesion_(computer_science))
高内聚通常与松散耦合相关,反之亦然
所以目标是实现高内聚和松耦合。要实现它,您需要开发只做一件事的类,将单体项目拆分为几个模块(DAO、UI、业务逻辑)并编程到一个接口,以便其他类(或其他模块)不了解其他类的内部结构类/模块,并且只知道外部合同(接口/API)。
在阅读您的问题之前,我不熟悉凝聚力的概念。来自维基百科(这里):
具有高内聚性的模块往往更受欢迎,因为高内聚性与软件的几个理想特征相关联,包括健壮性、可靠性、可重用性和可理解性。相比之下,低内聚与不良特征相关,例如难以维护、测试、重用甚至理解。
内聚通常与耦合形成对比,这是一个不同的概念。高内聚通常与松散耦合相关,反之亦然。
我认为您希望每个模块内具有高内聚性和它们之间的松散耦合,这可以通过让模块仅通过简单的抽象接口进行通信来实现。要定义这些接口,您需要设计一个清晰的关注点分离,其中所有紧密耦合的任务都在同一个类中完成,而具有不同粒度的任务(例如高级算法与低级实现细节)被分离出来并由接口抽象出来。