12

ウィキペディアから始めましょう:

より正式には、関数のデメテルの法則では、オブジェクトOのメソッドmは、次の種類のオブジェクトのメソッドのみを呼び出す必要があります。

  1. 〇そのもの
  2. m のパラメーター
  3. m 内で作成/インスタンス化されたオブジェクト
  4. O の直接コンポーネント オブジェクト
  5. m のスコープ内で、O からアクセスできるグローバル変数

ルール 1:

public class ClassOne {

    public void method1() {
        method2();
    }

    public void method2() {

    }
}

ルール 2:

public class ClassOne {

    public void method1(ClassTwo classTwo) {
        classTwo.method2();
    }
}

class ClassTwo {

    public void method2() {

    }
}

ルール 3:

public class ClassOne {

    public void method1() {
        ClassTwo classTwo = new ClassTwo();
        classTwo.method2();
    }
}

class ClassTwo {

    public void method2() {

    }
}

ルール 4 (@juharr に感謝):

public class ClassOne {

    private ClassTwo classTwo;

    public void method1() {
        classTwo = new ClassTwo();
        classTwo.method2();
    }
}

class ClassTwo {

    public void method2() {

    }
}

ルール 5:

?

ルール 5 を手伝ってくれる人はいますか?


そして、デメテルの法則は連鎖が悪いことを暗示していませんか?

User.getName().getLastName();

これにより、結合度が高くなります。


「聞くな、聞くな」も似たような原理ではないでしょうか。

これで全部ですか?私は何か間違っていますか?どうすればデメテルの法則に従うことができますか?

4

3 に答える 3

4

「聞かないでください」は少し違います。

Demeter: 最終的なものに何かをするために、そこから何かを得るために何かを得る必要はありません。

TDA: 別のオブジェクトから「情報」を取得してから決定しないでください。簡単な例:

if (someList.size() == 0) { bla

対。

if (someList.isEmpty()) { bla

どちらの場合も、他のオブジェクトのメソッドを呼び出しています。ただし、重要な違いがあります。最初の呼び出しでは、他のオブジェクトの「内部」状態が公開されます。次に、何らかの決定を下します。一方、「TDA」では、2 番目のバージョンが改善されました。その「ステータス評価」を他のオブジェクト内に残します。それによって何らかの形でカップリングを減らします。

ただし、記録のために: 2 番目の例で、そのリストの状態に基づいて決定を行います。その観点から、これはオプション 1 よりもわずかに優れたバージョンです。理想的には、そのようなチェックは必要ありません。

于 2016-03-10T19:58:33.617 に答える
2

5 番目は、技術的にグローバル変数をサポートしていないため、C# や Java で表現するのが困難です。ただし、原則が似ている設計パターンでは、たとえば、(C#) のように、グローバルにアクセス可能な静的構成値のみを含む構成クラスを使用できます。

internal class MyConfiguration
{
    private static String MyConfigurationValue; // set in constructor
    MyConfiguration(){ MyConfigurationValue = DoSomethingToLoadValue(); }
    public static String GetMyConfigurationValue(){ return MyConfigurationValue; }
}

この場合 (デザイン パターンが他のすべての点で受け入れられると仮定すると)、グローバルにアクセス可能であり、そのように意図されているため、デメテルの法則はこれを許可します。

于 2016-03-10T20:03:29.837 に答える