Должны ли конструкторы по умолчанию передавать значения NULL другому конструктору для создания зависимостей? - PullRequest
1 голос
/ 17 февраля 2012

У меня есть куча классов, которые имеют набор зависимостей.Внедрение зависимостей для этого проекта будет излишним, поэтому в настоящее время у нас есть следующий шаблон в ряде случаев:

public MyClass() : this(null, null) {}

public MyClass(Dependancy x, Dependancy y)
{
  this.x = x ?? new Dependancy();
  this.y = y ?? new Dependancy();
}

Мне не нравится этот код, но я не совсем уверен, почему.Одной из причин может быть тот факт, что он зависит от параметров, которые передаются, другая причина в том, что я хочу, чтобы параметр был нулевым, и оставался нулевым.

Есть ли веские причины избегать / использовать этот шаблон или любой другой, или это просто личные предпочтения?

Ответы [ 2 ]

4 голосов
/ 17 февраля 2012

Вам не нравится это по двум причинам:

  • Нет необходимости иметь параметризованный конструктор, которому вы передаете NULL;иметь второй конструктор без аргументов;
  • Наличие третьего класса (назовите его Factory, назовите его Container, не имеет значения), внедрение этих зависимостей по умолчанию никогда не будет излишним по сравнению с преимуществами.
3 голосов
/ 17 февраля 2012

В коде, который вы разместили, есть то, что вы используете , используя внедрение зависимостей, вы просто не используете Inversion of Control.MyClass содержит свои зависимости, но затем он берет на себя управление тем, что делать, если они не соответствуют ожиданиям.Есть несколько причин, по которым это неприятно:

  1. Класс более высокого уровня MyClass связан с классом более низкого уровня Dependency.
  2. MyClass действует как ServiceLocator , который сам по себе является анти-шаблоном, но также нарушает принцип единой ответственности.
  3. Конструктор без параметров имеет скрытые побочные эффекты;места, где он используется, по незнанию создают MyClass с его зависимостями, установленными на Dependency.

Как говорит @Alessandro Santini, я действительно рекомендую вам отказаться от этого и использовать DI /Контейнер IoC.По крайней мере избавиться от конструктора без параметров и заставить все, что хочет создать экземпляр MyClass, предоставить ему соответствующие зависимости.Затем конструктор с двумя аргументами должен генерировать исключения, если заданные зависимости являются нулевыми.

...