【发布时间】:2008-10-02 15:40:11
【问题描述】:
Law of Demeter 表示您应该只与您直接了解的对象交谈。也就是说,不要执行方法链接来与其他对象对话。当你这样做时,你正在与中间对象建立不正确的链接,不恰当地coupling你的代码与其他代码。
这很糟糕。
解决方案是让您知道的类本质上公开简单的包装器,将责任委托给与其有关系的对象。
这很好。
但是,这似乎导致班级的cohesion 较低。它不再只是简单地负责它所做的事情,而且它还具有某种意义上的委托,通过复制其相关对象的接口部分来降低代码的内聚性。
这很糟糕。
这真的会降低凝聚力吗?两害相权取其轻?
这是发展的灰色地带之一,您可以在其中讨论界限在哪里,或者是否有强有力的、有原则的方法来决定在哪里划定界限以及您可以使用什么标准来做出决定?
【问题讨论】:
-
虽然有点离题,但我强烈推荐 Ted Faisons “基于事件的编程:将事件发挥到极致”link。它对常见的耦合问题进行了很好的分解,并提供了一个很好的系统来衡量给定系统中的耦合量
-
违反 LoD 时,附加链接是否“不正确”取决于链接类的性质:如果这些非常突出(想想 Row、Column、Cell in Excel 的实现),与它们的耦合是没有问题的,而且 LoD 的限制过于严格。同样,如果有问题的类是有目的的纯粹的数据类,基本上没有行为。
标签: oop refactoring coupling law-of-demeter cohesion