【问题标题】:Preserving Law of Demeter with ArrayLists使用 ArrayLists 保持得墨忒耳定律
【发布时间】:2016-07-29 13:29:03
【问题描述】:

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

list.get(i).doSomething();

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

【问题讨论】:

  • 您能解释一下您是如何看待违反得墨忒耳法则的吗?
  • 也许描述更多你想做的事?我在这里没有看到问题,这不像您要连续调用 10 个吸气剂。
  • 我意识到这不是一个严重的违规行为,但它仍然看起来像是代码异味。这是一个 LoD 违规,因为我正在从 ArrayList 中检索一个对象,然后在检索到的对象上调用一个方法。从技术上讲,我应该做类似 list.callSomethingOn(i) 的事情来维护得墨忒耳法则,但这似乎也是错误的

标签: java arraylist refactoring law-of-demeter


【解决方案1】:

这不是违规行为。

如果你有课

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&lt;B&gt; 来保存B 的实例不会导致AB 之间的耦合更紧密。

【讨论】:

    【解决方案2】:

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

    在概念上,得墨忒耳定律提出一个实体只知道它的邻居,而不是陌生人,所以如果A 需要来自C 的东西,它应该与B 交谈以获取它而不是去任何进一步。

    我不会将List 称为“邻居”来应用这个概念。它是一个操作数据结构的对象,您可以在整个程序中使用它。因此,您的列表包含的Object 将被视为您的AB

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

    如果 List 的这个特定实例是程序逻辑的核心,并且您坚持要满足法律要求,则可以为 List 使用“装饰器”,它添加了其他方法来处理包含的 @987654334 @s

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多