デメテルの法則は実際には法則ではなく、他の呼び出しから受け取ったオブジェクトに対してメソッドを呼び出してはならないというスタイルガイドラインを規定しています。 このガイドラインに準拠したコードは保守、改変、およびリファクタリングが容易であり、メソッド間の結合がより疎であり、重複が少なく、情報がより秘匿化されています。 一方、このガイドラインを満たすために多くのラッパーメソッドを作成する必要がある場合があります。
例:
boolean pay(Customer c, Invoice invoice) {
int dollars = c.getWallet().contents; // 違反
if (dollars >= invoice.getAmount()) {
Wallet w = c.getWallet();
w.subtract(invoice.getAmount()); // 違反
return true;
}
return false;
}
上記の例は、Customer で payInvoice(Invoice invoice) メソッドとして実装した方がよい可能性があります。
ライブラリを変更することなしに修正できないデメテルの法則の違反を無視するには、「ライブラリメソッドへの呼び出しを無視してライブラリフィールドにアクセスする」オプションを使用します。