我正在阅读 Fowler 的重构书,对这两种代码气味感到有些困惑。
“消息链”是像 a.getB().getC().getValue()
这样的调用.
“中间人”是一种类似的方法
class A
{
object getCValue()
{
return b.getCValue();
}
}
我理解这两个部分的方式是,如果你有“消息链”,你可以通过引入“中间人”来缩短它们。如果你有“中间人”,你就把它们变成“消息链”......
现在显然必须对此进行一些限制,否则您将拥有程序员的旋转木马。 在什么时候我应该偏爱一个而不是另一个?
一种是将类耦合到不相关的类,另一种是将类耦合到结构。所以理论上我的方法是检查任何给定的变化是否减少了一种耦合,而不是增加了另一种耦合。但是是不是一种耦合更差,更应该被权衡? IE。如果可以移除 X 结构联轴器,只添加一类联轴器?
最佳答案
更喜欢中间人而不是消息链也称为 Law of Demeter ,可以概括为“只与您的直接依赖项交谈”。
使用中间人而不是消息链的一个好处是在进行单元测试时必须提供更少的模拟。当您不仅必须为它们的直接依赖关系而且它们的间接依赖关系提供模拟时,类变得非常难以测试。
它还有助于分离关注点,因为代码具有 A
并想要一个 C
不应该知道有一个B
涉及。这有助于模块化。
消息链的主要论点是您不必在中间编写样板文件,这在某些情况下可能有意义,但我认为经验法则应该是更喜欢中间人。
关于refactoring - "Message Chains"与 "Middle Man",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6609296/