1. ホーム
  2. c#

プログラマーが「オブジェクトではなくインターフェースに対してコードを書け」と言うのはどういう意味か?

2023-08-04 23:54:55

質問

私は、この度、非常に長くて困難な学習と研究の探求を開始しました。 を適用する TDD を私のワークフローに適用するための非常に長いクエストを開始しました。私は、TDD が IoC の原則と非常によく合うという印象を抱いています。

SOでTDDタグのついた質問をいくつか見た後、オブジェクトではなくインターフェースに対してプログラミングするのは良い考えだと読みました。

これが何であるか、そしてどのように実際のユースケースに適用するかについて、簡単なコード例を提供することができますか?簡単な例は、私 (および学習したい他の人々) が概念を把握するための鍵です。

どのように解決するのですか?

考えてみてください。

class MyClass
{
    //Implementation
    public void Foo() {}
}

class SomethingYouWantToTest
{
    public bool MyMethod(MyClass c)
    {
        //Code you want to test
        c.Foo();
    }
}

なぜなら MyMethodMyClass に置き換えたい場合は MyClass をモックオブジェクトに置き換えてユニットテストを行いたい場合、それはできません。インターフェイスを使用するのがベターです。

interface IMyClass
{
    void Foo();
}

class MyClass : IMyClass
{
    //Implementation
    public void Foo() {}
}

class SomethingYouWantToTest
{
    public bool MyMethod(IMyClass c)
    {
        //Code you want to test
        c.Foo();
    }
}

これで MyMethod をテストすることができます。なぜなら、これは特定の具象実装ではなくインターフェースのみを使用しているからです。そして、そのインターフェイスを実装することで、テストのために必要なあらゆる種類のモックや偽物を作成することができます。Rhino Mocks のようなライブラリもあります。 Rhino.Mocks.MockRepository.StrictMock<T>() のようなライブラリもあり、これは任意のインターフェイスを受け取り、その場でモックオブジェクトを構築してくれます。