2

コンストラクター インジェクションを使用すると、次のように依存関係がコンシューマーに注入されます (少なくとも、正しく理解できれば幸いです)。

public class SomeConsumer
{
    private IDependency someDependency;
    public SomeConsumer(IDependency someDependency)
    {
        if (someDependency != null)
        {
            this.someDependency = someDependency;
        }
        else
        {
            throw new ArgumentNullException("someDependency");
        }
    }

    public void Baz()
    {
        someDependency.DoSomething();
    }
    (...)
}

IDependency に Null オブジェクト パターンを使用する場合、ガード句は必要ですか? それとも Null オブジェクトを注入するのは間違っていますか?

更新:明確にするために、次のようなクラスとインターフェイスがあると仮定しましょう。

public interface IDependency
{
    void DoSomething();
}

public class NullDependency : IDependency
{
    public void DoSomething()
    {
        //Do nothing...
    }
}

public class RealDependency : IDependency
{
    public void DoSomething()
    {
        Console.WriteLine("Did something");
    }
}

public class Foo
{
    public void Bar()
    {
        IDependency dependency = new NullDependency();
        SomeConsumer sc = new SomeConsumer(dependency);
        sc.Baz();
    }
}

次に、SomeConsumer からガード句を安全に削除して、次のようにすることはできますか?

public class SomeConsumer
{
    private IDependency someDependency;
    public SomeConsumer(IDependency someDependency)
    {
        this.someDependency = someDependency;
    }

    public void Baz()
    {
        //if someDependency is a NullDependency, this does nothing
        someDependency.DoSomething(); 
    }
    (...)
}

nullまたは、注入されないかどうか確信が持てないため、ガード句を使用する必要がありますか?

4

3 に答える 3

2

どのような状況でもガード句を削除するのは好きではありません。誰がこのクラスを使用しても、作成されたすべてのオブジェクトは有効である必要があります。コンストラクターを介して null を挿入できるようにすると、無効なオブジェクトの作成が許可されます。後で、メソッドが呼び出されると何かが壊れます。

このクラスが内部かどうかは問題ではありません。問題は、コンストラクターを呼び出すときに、すべての場所で null 以外の値を生成するためにすべての手段が講じられていることを確認しますか? あなたの答えが「はい」であっても、次の質問は、なぜそれをチェックするために時間とエネルギーを浪費するのですか?

ガード句をそのままにしておくと、このクラスのすべてのオブジェクトが適切に構築されることがわかります。そうしないと、誤って null をコンストラクターに渡すと、まったく無関係なクラスが失敗し、エラーをこのコンストラクターまで追跡するのが難しくなります。

関連する注意事項として、一部のガード句 (null 以外の条件をテストする句) は、多くの場合、設計を再考する原因になります。この記事は興味深いかもしれません - Why do We Need Guard Clauses?

于 2015-08-19T20:27:33.437 に答える