首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >迭代器模式是否违反demeter定律?(最小知识原理)

迭代器模式是否违反demeter定律?(最小知识原理)
EN

Stack Overflow用户
提问于 2018-02-15 14:45:04
回答 3查看 270关注 0票数 3
代码语言:javascript
复制
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
    }
}

上面是一个简单的迭代器模式。

我想知道客户是否违反了最低知识原则。

在迭代器模式中违反原则是不可避免的吗?

EN

回答 3

Stack Overflow用户

发布于 2018-02-15 15:02:38

从技术上讲,客户端确实违反了法律,因为对象(迭代器)既不是实例变量,也不是传递的参数。然而,集合是一种纯数据结构,它们不受此法律的约束,Law of Demeter with data model objects

票数 0
EN

Stack Overflow用户

发布于 2018-02-17 01:44:25

LoD存在的原因是为了避免不必要的耦合,这会使程序变得脆弱。

根据德米特定律,C类的方法f应该只调用

的方法:

  1. C
  2. An由f

创建的

  1. 对象作为参数传递给f
  2. 对象保存在C

的实例变量中

由于Client中的someMethod()使用createIterator()创建迭代器(在许多情况下,这是一种多态工厂方法),因此它不违反LoD。条件#2允许f调用它创建的对象的方法。

票数 0
EN

Stack Overflow用户

发布于 2018-02-20 19:52:08

这里有一个Article on the Law of Demeter,它解释了你应该如何以及为什么应该遵循它。

简而言之:您展示的代码在违反LoD之前就停止了。

您可以使用迭代器,因为它是为您创建的。在你的方法中创建的任何对象,即使是间接的,你也可以处理。这样createIterator()就可以工作了,您可以访问Iterator对象了。

出于同样的原因,Iterator.hasNext()也可以正常工作。它会为你创建一个布尔值,然后你就可以访问它了。

然而,,从技术上讲,你不能接触任何你用Iterator.next()得到的东西。由于这些对象不是为您创建的,并且您没有对它们的直接引用,因此接触这些对象实际上会构成对LoD的违反。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48801328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档