当前位置: 首页 > 知识库问答 >
问题:

高内聚力如何帮助我们减少耦合?

顾池暝
2023-03-14

假设方法M1M2的责任密切相关

第一个例子:

如果

M1M2在classA中定义(因此classA具有高度的内聚性)

•类别B使用A.M1和类别C使用A.M2

然后

ABC类耦合

•更改M1的签名只需要更改B,而不需要更改C

第二个例子:

如果

M1在类A1中定义(因此BA1耦合)

M2A2类定义(因此CA2耦合)

然后

•更改M1的签名只需要更改B,而不需要更改C

a) 据我所知,上一个例子中的类与第一个例子中的类并不耦合!还是我错过了什么?

b) 据我所知,第一个示例中的类比第二个示例中的类更松散耦合,前提是:

>

  • 我们假设更改M1的签名也需要更改M2的签名,但我不认为这种情况经常发生?!

    或者,如果M1M2都对相同类型的T1数据进行操作,那么用T2替换T1将需要对M1M2进行更改?!

    或者,如果我们假设由于M1M2具有密切相关的责任,那么改变M1通常需要改变M2(即使M1没有直接或间接地调用M2)的可能性要大得多?!

    或者,如果我们假设由于M1M2具有密切相关的职责,那么某些类将需要M1M2(例如在单个类中具有M1M2会减少耦合)的可能性要大得多?!

    c) 在A中定义M1M2(而不是在A1中定义M1M2中定义A2)会减少耦合,还有其他原因吗?

    注意——我知道我们应该有高度内聚的模块,因为更容易维护和重用

    谢谢你

  • 共有1个答案

    祁和通
    2023-03-14

    是的。您缺少的是,如果ClassA是内聚的,那么更改M1将导致ClassB访问ClassA中的其他方法。它增加了维护,因为您不必修改ClassA本身的其他模块(方法和变量)。

    当我们称一个类为内聚的(比如ClassA)时,我们的意思是我们可以很容易地使用这个类的目的,而不必根据ClassA的要求使我们的调用者类(ClassB)。因此,ClassB不依赖于ClassA,因此内聚减少了。

    不要把凝聚力想成方法,方法不叫凝聚力,类才叫凝聚力。

     类似资料:
    • 在一次技术采访中,我被问及项目的凝聚力和耦合性。我详细解释了它们的定义,尽管我没有像他说的那样正确回答问题的第二部分。 “我们如何在一个项目中同时实现高度内聚和松散耦合的设计,请解释这种方法应该如何在一个整体项目中实现?” 我回答说这两个目标是矛盾的,所以我们需要找出每个项目或模块的最佳选择,但我无法提供全面的答案。 如果有人能帮我,我将不胜感激。

    • 我在理解语句。我已经在谷歌上搜索并阅读了很多关于这方面的内容,但仍然觉得很难理解。 据我所知,高内聚意味着我们应该有专门的类来执行特定的功能。希望这是正确的?就像信用卡验证类一样,它专门用于验证信用卡。 还不明白低耦合是什么意思?

    • 本文向大家介绍什么是耦合和凝聚力?相关面试题,主要包含被问及什么是耦合和凝聚力?时的应答技巧和注意事项,需要的朋友参考一下 组件之间依赖关系强度的度量被认为是耦合。一个好的设计总是被认为具有高内聚力和低耦合性。 面试官经常会问起凝聚力。它也是另一个测量单位。更像是一个模块内部的元素保持结合的程度。 必须记住,设计微服务的一个重要关键是低耦合和高内聚的组合。当低耦合时,服务对其他服务的依赖很少。这样

    • 目前,我将进一步介绍java类,这是该类如何简要定义的: 内聚:以高内聚为目标,在这种情况下,内聚意味着单个模块紧紧关注其任务。 耦合:以低耦合为目标,在这种情况下,耦合意味着两个或多个模块相互交织的程度。 如何确定凝聚力和耦合度的水平? 例如,我的一些方法调用了同一类中的其他方法。这意味着调用其他方法的方法依赖于其他方法,以便“调用”方法完成其代码块。这是否意味着我对同一类的方法具有低内聚和高耦

    • 在我的应用程序中,我有几个模块不适合“is-a”或“has-a”关系,但仍然需要相互通信和传递数据。为了尝试松散地耦合这些模块,我实现了一个事件总线类,用于处理从“事件海报”到“事件侦听器”的消息传递。 如果类希望注册接收某些事件,它们可以实现< code>IEventListener。同样,如果需要将事件推到总线上,类可以调用< code > event bus::postEvent()。当调用

    • 我应该写两个版本的相同代码。一个具有低耦合和高内聚,另一个仍然具有低耦合,但这次具有低内聚。我真的不明白有什么区别?我怎么可能有低耦合和低内聚?它们似乎如此相关,以至于这是不可能做到的。 有人能解释一下吗?也许用一个例子?谢谢。