インターフェイスは、オブジェクトとその共同編集者の1人とのやり取りを模擬したいときに便利です。ただし、内部状態を持つオブジェクトのインタフェースには値が少なくなります。
たとえば、あるドメインオブジェクトを何らかの方法で操作するためにリポジトリと通信するサービスがあるとします。
リポジトリからインタフェースを抽出する際の明確な設計値があります。私のリポジトリの具体的な実装は、NHibernateやActiveRecordに強く結びついているかもしれません。私のサービスをインターフェイスにリンクすることによって、この実装の詳細から明確に分離することができます。それは私がIRepositoryを手に入れることができるようになりましたので、サービスのための超高速スタンドアロンユニットテストを書くこともできます。
リポジトリから戻ってきたドメインオブジェクトを考慮して、私のサービスが動作するドメインオブジェクトを考えると、価値は低くなります。私のサービスのテストを書くとき、私は実際のドメインオブジェクトを使い、その状態をチェックしたいと思うでしょう。例えば。 service.AddSomething()の呼び出しの後、何かがドメインオブジェクトに追加されたことを確認したい。ドメインオブジェクトの状態を簡単に調べることでこれをテストできます。ドメインオブジェクトを孤立してテストすると、オブジェクトに対する操作を実行して内部状態でクイズするだけなので、インターフェイスは必要ありません。例えば私の羊が眠っている場合、草を食べることは有効ですか?
最初のケースでは、我々は相互作用ベースのテストに興味があります。テスト対象のオブジェクトとそのコラボレーターとの間を通るコールをモックで傍受したいので、インターフェースが役立ちます。 2番目のケースでは、州ベースのテストに興味があります。インタフェースはここでは役に立ちません。あなたが状態やインタラクションをテストしているかどうかを意識して、それがあなたのインターフェースに影響を与えるか、インターフェースの決定に影響を及ぼさないようにしてください。
(Resharperがインストールされていれば)後でインターフェイスを抽出するのが非常に安いことに注意してください。結局そのインターフェースを必要としないと決めたら、インターフェースを削除してより簡単なクラス階層に戻すことも安価です。私のアドバイスは、インターフェイスを使わずに開始し、インタラクションを模擬したいと思ったときに必要に応じて抽出することです。
IoCを画像に追加すると、より多くのインターフェイスを抽出する傾向がありますが、IoCコンテナにいくつのクラスを押し込めばいいか分かりません。一般に、これらの制限された主としてステートレスなサービスオブジェクトを保持したいとします。
今、みんな...コンピュータを切り替えてお互いのコードを読んでください! –