使用 ArrayLists 保持 Demeter 法则

Preserving Law of Demeter with ArrayLists

如果我有对象的 ArrayList,那么任何时候我需要调用 ArrayList 成员的任何方法时,我都需要这样做:

list.get(i).doSomething();

这看起来很可能违反得墨忒耳法则。我看不出有什么办法可以解决这个问题。这很好还是我应该重新考虑我如何做这样的事情。 ArrayList 是一个定义为忽略 Demeter 法则的对象吗?

没有违规。

如果你有 class

Class A {
    private B b1, b2, b3;

    ...

   private void method() {
       b1.doSomething();
       b2.doSomething();
       b3.doSomething();
   }
}

没有违规。如果我们将 B 的实例收集到 List<B> 中,你会得到

Class A {
    private List<B> listOfB;

    ...

   private void method() {
       listOfB.forEach(B::doSomething);
   }
}

使用 List<B> 来保存 B 的实例导致 AB 之间没有更紧密的耦合。

我真的没有看到这里有违规行为。

Demeter 法则在概念上提出,一个实体只知道它的邻居,而不是陌生人,所以如果 A 需要来自 C 的东西,它应该与 [=12= 交谈] 得到它,不再继续。

我不会准确地将 List 称为 "neighbor" 来应用这个概念。它是一个操作数据结构的对象,您可以在整个程序中使用该数据结构。因此,您的列表包含的 Object 将被视为您的 A.

B

如果 List 是您程序中定义的实际实体,那么在这种情况下您可能是对的。让你的 List 有一个方法来调用你的 Object 来执行一些逻辑会更有意义(正如你在评论中所说,list.callSomethingOn(i))。

如果 List 的这个特定实例是您程序逻辑的核心,并且您坚持要满足法律,则可以对 List 使用 "Decorator",这会增加额外的使用包含的 Objects

的方法