refactoring - "Message Chains"与 "Middle Man"

标签 refactoring

我正在阅读 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/

相关文章:

asp.net-mvc - 如何让 Visual Studio 也对 View /页面执行重构?

javascript - 使我的 readPackageFiles 符合 "Parallel"函数

c# - 如何在大型项目中查找重复项?

java - 安卓工作室说 'Local variable is redundant'

Java反模式名称?包含对象的对象包含...等等

c++ - 优化 switch 结构——如何避免添加 if 子句

delphi - Delphi 7 中的 "Rename control"?

c++ - 如何在不影响性能的情况下隔离 C++ 代码?

java - 基于不同服务构建请求的最佳方式/模式

VB.NET 简化操作(T)