【问题标题】:How does High Cohesion help us reduce Coupling?高内聚如何帮助我们减少耦合?
【发布时间】:2012-06-26 18:38:48
【问题描述】:

假设方法M1M2 具有密切相关的职责

第一个例子:

如果

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

B 类使用A.M1C 类使用A.M2

那么

ABC 类耦合

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

第二个例子:

如果

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

M2 定义在 A2 类中(因此 CA2 耦合)

那么

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

a) 据我了解,上一个示例中的类并不比第一个示例中的类更耦合!还是我错过了什么?

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

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

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

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

  • 或者如果我们假设由于M1M2 具有密切相关的职责,某些类需要M1M2 的可能性要大得多(因此具有M1 和@987654365单个类中的@减少耦合)?!

c) 是否有任何其他原因为什么在 A 内定义 M1M2(而不是在 A1A1 内定义 M1M2A2 内)会减少耦合?

注意 - 我知道由于更易于维护和可重用性,我们应该拥有高度内聚的模块

谢谢

【问题讨论】:

    标签: oop coupling design-principles cohesion


    【解决方案1】:

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

    当我们调用一个类内聚的(比如 ClassA)时,我们的意思是我们可以很容易地使用类的目的,而不必根据 ClassA 的要求来创建我们的调用者类(ClassB)。因此,ClassB 不依赖于 ClassA,从而降低了内聚力。

    不要从方法的角度考虑凝聚力。方法不叫内聚,类才是。

    【讨论】:

    • "...更改 M1 将导致 ClassB 访问 ClassA 中的其他方法" 我没有关注你。为什么更改 M1 会导致 B 类访问 A 类中的其他方法?
    • 那是因为 A 是高度内聚的(相反,如果 A 是高度内聚的,那么这一切都是真的
    • "...all this will be true" 你的意思是我在 b) 下所做的所有假设都是正确的,如果 A 是高度内聚的?
    猜你喜欢
    • 1970-01-01
    • 2019-02-14
    • 2010-09-07
    • 2012-12-09
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多