"消息链"与"中间人"

Kem*_*eth 15 refactoring

我正在阅读福勒的重构书,对这两个代码气味有点困惑.

"消息链"就是这样的调用a.getB().getC().getValue().

"中间人"是一种类似的方法

class A
{
    object getCValue()
    {
        return b.getCValue();
    }
}
Run Code Online (Sandbox Code Playgroud)

我理解这两个部分的方式是,如果你有"消息链",你可以通过引入"中间人"来缩短它们.如果你有"中间人"你将它们变成"消息链"......

现在显然必须有一些限制,或者你有一个程序员的旋转木马.我应该在什么时候支持一个而不是另一个?

一个是将类耦合到不相关的类,另一个是将类耦合到结构.所以从理论上讲,我的方法是检查任何给定的变化是否会减少一种耦合,而不是增加另一种耦合.但是,一种耦合是否更糟,应该更加权衡?即如果你可以删除X结构联轴器,只需添加一个类联轴器?

ham*_*mar 10

优先考虑消息链的中间人也称为Demeter法,可以概括为"只与你的直接依赖关系".

使用中间人而不是消息链的一个好处是,在进行单元测试时必须提供更少的模拟.当你不仅要为它们的直接依赖而且还要为它们的间接依赖提供模拟时,类变得非常难以测试.

它还有助于分离关注点,因为具有A并且想要的代码C不应该知道存在B涉及的问题.这有助于模块化.

消息链的主要论点是你不必在中间编写样板文件,在某些情况下它可能有意义,但我认为经验法则应该是偏爱中间人.