【问题标题】:Law of Demeter and local variables inside function得墨忒耳定律和函数内部的局部变量
【发布时间】:2020-11-07 08:45:28
【问题描述】:

我试图理解得墨忒耳定律。这个例子(取自《实用程序员》一书)让我很困惑。任务是根据得墨忒耳法则确定显示的方法调用是否允许。

public void showBalance(BankAccount acct) {
Money amt = acct. getBalance() ;
printToScreen(amt .printFormat()) ;
}

针对这个任务,写着它违反了得墨忒耳定律,但我不明白为什么? 根据得墨忒耳定律,对象 O 的方法 M 只能调用以下方法:

  1. Object O 本身的方法(因为你可以自言自语)
  2. 作为参数传递给 M 的对象方法
  3. 实例变量中保存的对象的方法
  4. 在方法 M 中本地创建的对象的方法
  5. 静态字段的方法

对象amt 是在方法showBalance(BankAccount acct) 中本地创建的,我们在该对象上调用方法getBalance(),这是根据规则4 允许的。这让我感到困惑。

【问题讨论】:

  • 它调用的方法printToScreen 来自哪里?根据这些规则,这似乎是方法体中唯一潜在的异常值。
  • printToScreen 方法通过参数 acct.getBalance().printFormat() 有效调用。这有帮助吗?
  • @TimHunter printToScreen 方法在同一个类中声明,其中方法 showBalance 被声明。根据得墨忒耳法则,允许在showBalance 方法中调用该方法。

标签: java oop law-of-demeter


【解决方案1】:

对象amt 不是在showBalance创建 - 您可以通过对getBalance 的方法调用来检索它。

您无法通过仅将值提取到局部变量来绕过得墨忒耳定律,它需要仔细设计。你的代码相当于这个,应该是LoD禁止的:

printToScreen(acct.getBalance().printFormat());

【讨论】:

  • 谢谢,我现在明白了! :)
猜你喜欢
  • 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
相关资源
最近更新 更多