デメテルの法則は依存関係に関するもので、-> (または他の言語ではドット) ではありません。
たとえば、流暢なインターフェイス (メソッドがこれを返す場所) がある場合、この法則は適用されません。
クラスが最小限の数の他のクラスに依存するようにします。
クラスが他の 10 個のクラスに依存している場合、それらのいずれかを変更すると、クラスが壊れる可能性があります。あなたのクラスが何をするのかを理解するのは難しいです。そのようなクラスをテストすることも困難です。
$field->getDependency1()->getDependency2()
あなたが持っているかどうかは関係ありません$field->dependency1->dependency2
-あなたのコードはまだ他の2つのクラスに依存しており、依存関係1の内部構造を知っています(内部に依存関係2があること)。
tell don't ask principalで問題を解決できます。OOD では、データを保持するだけの構造を使用したくありません。フィールドの処理方法を知っているオブジェクトが必要です。
たとえば、次のようにリファクタリングできます。
$oldBalance = $bank->getAccount()->getBalance();
$bank->getAccount()->setBalance($oldBalance - $amount);
に:
$bank->withdraw($amount);
銀行クラス:
function withdraw($amount) {
$this->account->withdraw($amount);
}
Account クラス:
function withdraw($amount) {
$this->balance = $this->balance - $amount;
}
メソッドは他にもありますが、$bank を使用するコードは Account とその残高について何も知りません。$bank フィールドのみをモックするクラスを簡単にテストできます。また、再利用可能なコードも増えました。