HttpPostedFileBase
上面的是一个简单的迭代器模式。
我不知道客户是否违反了最少知识的原则。
在迭代器模式中违反原则是不可避免的吗?
答案 0 :(得分:0)
从技术上讲,客户端确实违反了法律,因为对象(迭代器)既不是实例变量也不是传递参数。然而,集合是纯数据结构,它们不受此法律的约束 Law of Demeter with data model objects
答案 1 :(得分:0)
LoD存在的原因是为了避免不必要的耦合,这会使程序变得脆弱。
Demeter法则说C类方法只能调用这些方法:
- C
- 由f
创建的对象- 作为参数传递给f
的对象- 保存在C
的实例变量中的对象 醇>
由于someMethod()
中的Client
创建了带createIterator()
的迭代器(在很多情况下是多态的Factory方法),因此它不会违反LoD。条件#2允许f调用它创建的对象的方法。
答案 2 :(得分:0)
这是一个Article on the Law of Demeter,它解释了您应该如何以及为什么要遵循它。
简而言之:您展示的代码在它违反LoD之前就停止了。
您可以使用迭代器,因为它是创建的。在您的方法中创建的任何对象,甚至是间接的,您都可以处理。因此createIterator()
有效,您可以访问Iterator
对象。
Iterator.hasNext()
也有同样的原因。它会为您创建一个布尔值,然后您可以访问它。
但是,从技术上讲,您可能不会触及Iterator.next()
所获得的任何项目。由于这些对象不是为您创建的,并且您没有直接引用它们,因此触摸这些对象实际上会违反LoD。