Зачем извлекать интерфейс, когда мы можем DI делегировать, чтобы сделать его тестируемым? - PullRequest
1 голос
/ 10 ноября 2011

Я просматривал ТАК и наткнулся на этот комментарий на ответ:

Почему мы проводим церемонию извлечения интерфейса, когда мы может ли DI делегат сделать его тестируемым?

Это сформулировало мысль, которую я имел в начале года. Что-то не так с внедрением чистой функциональности (я полагаю, указателей функций) вместо реализаций интерфейса?

1 Ответ

2 голосов
/ 10 ноября 2011

Слово «церемония» в описании интерфейсов звучит подозрительно, как комментарий от Ruby-ist, который против статической типизации. С хорошим инструментом рефакторинга и шаблонов большая часть церемонии все равно остается незамеченной.

Несмотря на то, что передача делегата имеет свое место, 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);

, что означает, что вам нужно заменить тип класса интерфейсом для насмешек.

...