1

私はSOを閲覧していて、答えについてこのコメントに出くわしました。

デリゲートをDIしてテスト可能にすることができるのに、なぜインターフェイスを抽出するセレモニーを通過するのですか?

これは、私がその年の初めに持っていた考えを明確に示しました。インターフェイスの実装の代わりに純粋な機能(関数ポインタ、私は推測する)を注入することに本質的に何か問題がありますか?

4

1 に答える 1

2

インターフェイスを説明する際の「セレモニー」という言葉は、静的型付けに反対するRubyリストからのコメントのように疑わしいように聞こえます。優れたリファクタリングおよびテンプレートツールを使用すると、式典のほとんどはとにかく見過ごされます。

デリゲートを渡すことにはその場所がありますが、インターフェイスを備えたIoCは通常、実装、使用、理解、および保守が簡単です。

典型的なコンストラクターを考えてみましょう。

public class MyClass
{
  public MyClass(IAmEasyToUnderstand easy)
  {
    if (easy == null) throw new ArgumentNullException("easy");
  }

  public MyClass(Func<bool, int, int, Point> IAmNot, Func<bool> Clear, Action aboutAnything)
  {
    //multiple null checks.
  } 
}

public interface IAmEasyToUnderstand
{
   bool DoPointStuff(int a, int b, Point point);
   bool CanHazExecute();
   Action RunRun();
}

次に、別のユーザーが使用するためのインターフェイスを返すクラスについて考えてみます。

public MyClass
{
  //IFace
   public IAmEasyToUnderstand FindEasy();

  //Not Iface
   Func<bool, int, int, Point> ReturnPointStuffDoer();
   Func<bool> ReturnCanHazExecuteCallback();
   Action WowThisIsAnnoying();
}


var easy = myclassInstance.FindEasy();
var consumer = new EasyConsumer(easy);

....

var consumer = new EasyConsumer(
              myClassInstance.ReturnPointStuffDoer(),
              myClassInstance.ReturnCanHazExecuteCallback(),
              myClassInstance.WowThisIsAnnoying());

後者の消費例を見ると、明らかなクリーンアップは次のようになります。

var consumer = new EasyConsumer(myclassInstance);

つまり、クラスタイプをモック用のインターフェイスに置き換える必要があります。

于 2011-11-10T06:40:44.333 に答える