class MyCollection {
Items menuItems;
...
public Iterator createIterator() {
return new Iterator(menuItems);
}
}
class Client {
public someMethod() {
Iterator iterator = collection.createIterator();
while(iterator.hasNext()) { //doSomething }
// Client is calling iterator's method directly
}
}上面是一个简单的迭代器模式。
我想知道客户是否违反了最低知识原则。
在迭代器模式中违反原则是不可避免的吗?
发布于 2018-02-15 15:02:38
从技术上讲,客户端确实违反了法律,因为对象(迭代器)既不是实例变量,也不是传递的参数。然而,集合是一种纯数据结构,它们不受此法律的约束,Law of Demeter with data model objects
发布于 2018-02-17 01:44:25
LoD存在的原因是为了避免不必要的耦合,这会使程序变得脆弱。
根据德米特定律,C类的方法f应该只调用
的方法:
创建的
的实例变量中
由于Client中的someMethod()使用createIterator()创建迭代器(在许多情况下,这是一种多态工厂方法),因此它不违反LoD。条件#2允许f调用它创建的对象的方法。
发布于 2018-02-20 19:52:08
这里有一个Article on the Law of Demeter,它解释了你应该如何以及为什么应该遵循它。
简而言之:您展示的代码在违反LoD之前就停止了。
您可以使用迭代器,因为它是为您创建的。在你的方法中创建的任何对象,即使是间接的,你也可以处理。这样createIterator()就可以工作了,您可以访问Iterator对象了。
出于同样的原因,Iterator.hasNext()也可以正常工作。它会为你创建一个布尔值,然后你就可以访问它了。
然而,,从技术上讲,你不能接触任何你用Iterator.next()得到的东西。由于这些对象不是为您创建的,并且您没有对它们的直接引用,因此接触这些对象实际上会构成对LoD的违反。
https://stackoverflow.com/questions/48801328
复制相似问题