什么时候提高程序内聚性会恶化耦合?

When does improving program cohesion worsen coupling?

最近考了设计原则和模式,其中一题如下:"Sometimes improving program cohesion may worsen coupling, give an example."

据我了解,凝聚力是 class/module 对解决问题的专注程度,或者更好的是,它在完成工作方面有多好。它会做它不应该做的工作吗?然后将该部分移动到不同的 class/module.

耦合是许多 classes/modules 之间的依赖程度。这意味着无论我们是否对不同的 module/class.

进行重大更改,好的 class/module 都会起作用

我用来向自己解释的一种方式是这个例子: 调酒师的工作是制作咖啡和其他饮品。一个好的调酒师应该做好他的工作,也就是煮咖啡,这会增加他的凝聚力,但如果他开始拖地并为顾客服务,他就会脱离他的工作,从而失去凝聚力。一个好的调酒师也不应该受到其他工作人员的影响,这意味着他的耦合度很低。换句话说,如果清洁女工一天早上不来上班,他的工作应该不会受到影响。

所以如果我的理解是正确的,这意味着增加凝聚力不应该对耦合产生负面影响,就像告诉调酒师更多地专注于咖啡不会让他更加依赖清洁女工一样。

我错过了什么吗?我对 cohesion/coupling 的理解有问题吗?抱歉阅读时间过长!

如果酒吧的员工非常有凝聚力,他们就会了解彼此的工作,并且可以更有效地作为一个团队工作。例如,鸡尾酒女服务员可能知道调酒师喜欢把脏盘子取回哪里(吧台靠近洗碗机的部分),所以女服务员会把空杯子放在那里。或者经理可能会注意到调酒师的冰块越来越少,然后去房子后面拿更多的冰块,然后在不需要询问的情况下重新加满。

当然,通过了解彼此的工作,员工之间的联系更加紧密。这可能意味着流程中的任何更改都会影响更多人并产生培训问题。例如,如果酒吧决定从冰块换成碎冰,就必须通知经理,否则他可能会得到错误的冰块。如果团队松耦合,只有调酒师需要知道。

从这个例子可以看出,一个非常有凝聚力的团队需要了解彼此的工作,这使得改变任何个人的工作变得更加困难。这对应于软件中紧密耦合的模块所产生的可维护性问题。这很方便,并且可以让模块更紧密地协同工作,但如果事情发生变化,就会产生问题。