得墨忒耳法则——真的只与朋友交流吗?

Law of Demeter - is it really communicating only to friends?

我读了一些关于得墨忒耳法则的文章,让我感到困惑。

它说的是这样的:

var width = mapControl.get_mapState().getMapRange().getSize().get_width();

应替换为:

var mapState = mapControl.get_mapState();
var mapRange = mapState.get_mapRange();
var width = mapRange.get_width()

我在这里有点困惑,因为后一个与第一个相同但写法不同。在这两种情况下,我最终都访问了 "width",它不是我当前 class.

的直接朋友

那么为什么第二种方式更好呢?

I am a little confiused here cause the latter one is just the same as the first one but written differently. In both cases I am eventually accessing "width" which is not a direct friend of my current class.

So why is the second way really better?

其实也好不到哪儿去。得墨忒耳法则是重构代码,因此客户端代码如下所示:

var width = mapControl.get_width();

在这种情况下,客户端代码不需要知道 mapControl 有一个“状态”,它有一个“范围”,它有一个“宽度”。它只需要知道它公开了一个“宽度”。