demeter法和hashmap法

时间:2012-01-27 20:42:07

标签: oop

我几乎没有问题。 首先,下面的代码是否违反了得墨忒耳的法律?

Map map = new HashMap<String, String>();
map.put("foo","bar");
map.put("fooo","baaar");
map.keySet().iterator()

上面的IMO代码违反了Demeter法则,因为地图类型是Map,而keySet()返回Set对象。两者都不同。我正在考虑第二个属性只保留“密钥”,但这是正确的解决方案吗?

1 个答案:

答案 0 :(得分:1)

是的,从技术上讲,这是违反了德米特定律的方法。但是,修复它的方法是将添加像“keysIterator”这样的操作到Map类,这可能是一个合理的操作,除了这里 Map不是你的代码

Demeter法则的目的旨在减少应用程序组件之间的耦合。更改使用标准库对象的方式不会影响该对象。您提出的解决方案浪费资源,没有特别的好处。

从另一个角度来看,Map的keySet实际上只是Map的一个方面。您应该认为它不是第三个对象(其中LoD基本上表示您在任何交互中不应该有两个以上的对象)作为对Map提供的操作进行分类的方法。


想象一下不同的场景:假设您有一个应用程序类,比如在线商店中的类别。

是一个有意义的 LoD违规行为
category.itemsSet().iterator()

这是你可能想要重构的东西。为什么?因为它约束了Category类来实现一个Set,即使实际需要的唯一操作是迭代(或者,通常比Set接口具有的操作少),而不是只有一个只执行必要工作的实现,并且可以更容易修改或重新实现。

另一方面,如果你想对一个类别做的事情涵盖了所有的Set操作,那么不提供Category.itemsSet()方面是愚蠢的。


注意:“Facet”在这里指的是与另一个对象成1:1关系的对象,本质上是“同一个东西”的不同视图,尤其是较窄的视图。这不是一个完全标准的术语。