迭代器模式是否违反了demeter定律? (最少知道原则)

时间:2018-02-15 06:45:04

标签: java design-patterns law-of-demeter

HttpPostedFileBase
上面的

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

我不知道客户是否违反了最少知识的原则。

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  

Demeter法则说C类方法只能调用这些方法:

     
      
  1. C
  2.   
  3. 由f
  4. 创建的对象   
  5. 作为参数传递给f
  6. 的对象   
  7. 保存在C
  8. 的实例变量中的对象   

由于someMethod()中的Client创建了带createIterator()的迭代器(在很多情况下是多态的Factory方法),因此它不会违反LoD。条件#2允许f调用它创建的对象的方法。

答案 2 :(得分:0)

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

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

您可以使用迭代器,因为它是创建的。在您的方法中创建的任何对象,甚至是间接的,您都可以处理。因此createIterator()有效,您可以访问Iterator对象。

Iterator.hasNext()也有同样的原因。它会为您创建一个布尔值,然后您可以访问它。

但是,从技术上讲,您可能不会触及Iterator.next()所获得的任何项目。由于这些对象不是为您创建的,并且您没有直接引用它们,因此触摸这些对象实际上会违反LoD。