0

私はそれが悪いと考えられていることを知っています:

$this->laptop->getKeyboard()->getTouchpad()->getLbutton();

また

$this->laptop->getKeyboard()->getCapslock()->isLedOn();

「大量の->->->->は必要ありません」と説明されていますが、この構造を物理的にしたかったので、切り離すことはできません。アーキテクトが変わればどこでもやらなければならないことは理解していますが、そうはいきません。もう一度、これを回避するにはどうすればよいですか?

4

2 に答える 2

7

デメテルの法則は依存関係に関するもので、-> (または他の言語ではドット) ではありません。

たとえば、流暢なインターフェイス (メソッドがこれを返す場所) がある場合、この法則は適用されません。

クラスが最小限の数の他のクラスに依存するようにします。

クラスが他の 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 フィールドのみをモックするクラスを簡単にテストできます。また、再利用可能なコードも増えました。

于 2015-01-19T11:11:47.533 に答える
6

次の会話を想像してください。

You: Hey Laptop, get me the I/O devices
Laptop: There you go
You: Hey IODevices, get me the keyboard
IODevices: There you go
You: Hey Keyboard, get me the touchpad
Keyboard: There you go
You: Hey Touchpad, I want to press your left button
Touchpad: Consider it done Boss!

男、あなたはおかしな電子機器のファンボーイですか、それとも生活のためにやっているのですか - あなたはラップトップのすべての小さな部分を知っています! ;)

対これ:

You: Hey Laptop, I want to press left button on the touchpad
// Laptop gets the job done
Laptop: Done Boss!

2 番目の会話では、ボンネットの下で、

  1. Laptopその依存関係を呼び出しますIODevices(それについて何も知る必要はありません)。
  2. IODevicesその依存関係を呼び出しますKeyboard(Latopそれについて知る必要はありません)。
  3. Keyboard依存関係を取得しTouchpad(IODevicesそれについて知る必要はありません。実際には少し悪い例ですが... アイデアはわかります)、それを呼び出しますpressLeftButton()

とはいえ、細かいことは気にせず、やりたいことはpressLeftButton. Keyboardどのように とが関連付けられているか、各メソッドから何が返されるかなどを知る必要はありませんTouchpad。実装する必要があるパブリック インターフェイスがあります。

後者が同じインターフェイスを実装している限り、 に置き換えKeyboardXyzても何も壊れないため、これは誰もが幸せになります。KeyboardAbc

于 2015-01-19T11:37:04.077 に答える