私はSOを閲覧していて、答えについてこのコメントに出くわしました。
デリゲートをDIしてテスト可能にすることができるのに、なぜインターフェイスを抽出するセレモニーを通過するのですか?
これは、私がその年の初めに持っていた考えを明確に示しました。インターフェイスの実装の代わりに純粋な機能(関数ポインタ、私は推測する)を注入することに本質的に何か問題がありますか?
私はSOを閲覧していて、答えについてこのコメントに出くわしました。
デリゲートをDIしてテスト可能にすることができるのに、なぜインターフェイスを抽出するセレモニーを通過するのですか?
これは、私がその年の初めに持っていた考えを明確に示しました。インターフェイスの実装の代わりに純粋な機能(関数ポインタ、私は推測する)を注入することに本質的に何か問題がありますか?
インターフェイスを説明する際の「セレモニー」という言葉は、静的型付けに反対する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);
つまり、クラスタイプをモック用のインターフェイスに置き換える必要があります。