4

The Pragmatic Programmer の143 ページに次のようなコード スニペットがあります。

public class Colada {
    private Blender myBlender;
    private Vector myStuff;

    public Colada() {
        myBlender = new Blender();
        myStuff = new Vector();
    }
    private doSomething() {
        myBlender.addIngredients(myStuff.elements());
    }
}

これは、デメテルの法則/最小知識の原則に従います。

依存性注入を利用する以下のものに置き換えることが望ましいですか、また注意事項はありますか?

public class Colada throws IllegalArgumentException {
    private Blender myBlender;
    private Vector myStuff;

    public Colada(Blender blender, Vector stuff) {
        if (null == blender) {
            throw new IllegalArgumentException()
        } else {
            myBlender = blender;
        }
        if (null == stuff) {
            throw new IllegalArgumentException()
        } else {
           myStuff = stuff;
        }
    }

    public static Colada createDefaultInstance() {   
        Blender blender = new Blender();
        Vector stuff = new Vector();

        return new Colada(blender, stuff);
    }

    private doSomething() {
        myBlender.addIngredients(myStuff.elements());
    }
}
4

2 に答える 2

4

オブジェクトの作成をどのように構造化するかは、それが公開するAPIとは別の問題です。

デメテルの法則は、クラスの構築方法ではなく、クラスの API について何かを述べているため、コンストラクター インジェクションとデメテルの法則の間に矛盾は見られません。

とはいえ、依存性注入を使用することに決めたら、オブジェクトの作成に関してあいまいさを避けるように注意する必要があります。パラメーターなしのコンストラクターまたは静的ファクトリ メソッドを提供し続けると、外部の呼び出し元に依存関係の階層を構成させる代わりに、これを使用する可能性があります。

開発者がファクトリ メソッド (またはパラメーターなしのコンストラクター) を使用して誤って依存関係の階層を壊すたびに、その時点で密結合が発生します。DI を使用することに決めた場合は、一貫して使用することで得られるメリットを最大限に活用できます。

于 2010-03-19T08:12:23.633 に答える
2

public getInstance()、それは「public static Colada getInstance()」ではないでしょうか?

私の世界ではどちらも問題ありません。最初のものはより読みやすく、2番目のものはよりダイナミックです。しかし、どちらも myBlender と myStuff がプロパティであることを示唆していません。しかし、それがあなたの望むものなら、それは問題ないように見えます。getInstance の代わりに、2 つのコンストラクターを作成します。1 つは最初の例のように引数なしで、もう 1 つは 2 番目の例のように 2 つの引数を持ちます。

乾杯

ニック

于 2010-03-19T07:41:21.013 に答える