使用 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
的实例导致 A
和 B
之间没有更紧密的耦合。
我真的没有看到这里有违规行为。
Demeter 法则在概念上提出,一个实体只知道它的邻居,而不是陌生人,所以如果 A
需要来自 C
的东西,它应该与 [=12= 交谈] 得到它,不再继续。
我不会准确地将 List
称为 "neighbor" 来应用这个概念。它是一个操作数据结构的对象,您可以在整个程序中使用该数据结构。因此,您的列表包含的 Object
将被视为您的 A
.
的 B
如果 List
是您程序中定义的实际实体,那么在这种情况下您可能是对的。让你的 List
有一个方法来调用你的 Object
来执行一些逻辑会更有意义(正如你在评论中所说,list.callSomethingOn(i)
)。
如果 List
的这个特定实例是您程序逻辑的核心,并且您坚持要满足法律,则可以对 List
使用 "Decorator",这会增加额外的使用包含的 Object
s
的方法
如果我有对象的 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
的实例导致 A
和 B
之间没有更紧密的耦合。
我真的没有看到这里有违规行为。
Demeter 法则在概念上提出,一个实体只知道它的邻居,而不是陌生人,所以如果 A
需要来自 C
的东西,它应该与 [=12= 交谈] 得到它,不再继续。
我不会准确地将 List
称为 "neighbor" 来应用这个概念。它是一个操作数据结构的对象,您可以在整个程序中使用该数据结构。因此,您的列表包含的 Object
将被视为您的 A
.
B
如果 List
是您程序中定义的实际实体,那么在这种情况下您可能是对的。让你的 List
有一个方法来调用你的 Object
来执行一些逻辑会更有意义(正如你在评论中所说,list.callSomethingOn(i)
)。
如果 List
的这个特定实例是您程序逻辑的核心,并且您坚持要满足法律,则可以对 List
使用 "Decorator",这会增加额外的使用包含的 Object
s