2009-12-15 6 views

ответ

1

Я собираюсь получить -20 для этого. Даже пресловутый Мартин Фаулер, который изобрел это ужасающее название «Dependency Injection» не думает, что это лучше для тестирования:

http://martinfowler.com/articles/injection.html

Частой причиной люди дают для предпочитающих инъекции зависимостей является то, что она делает тестирование легче , Дело в том, что для проведения тестирования вам нужно легко заменить настоящие сервисные реализации заглушками или макетами. Однако здесь нет никакой разницы между инъекцией зависимостей и локатором сервисов: оба они очень подходят для прерывания. Я подозреваю, что это наблюдение происходит от проектов, в которых люди не прилагают усилий для обеспечения того, чтобы их локатор обслуживания можно было легко заменить. Это то, где постоянное тестирование помогает, если вы не можете легко заглушить услуги для тестирования, то это подразумевает серьезную проблему с вашим дизайном.

Вот мои возражения:

  1. DI превращает зависимость реализации в зависимости интерфейса. Ваш класс загрязнен сеттерами, которых в противном случае не было. Да, реальный процесс проверки зависит от службы кредитных карт, почтовой службы, службы базы данных и тех, кто знает, что завтра, но мы не должны рекламировать эти зависимости. Они ad-hoc, по требованию, не совместимы с интерфейсом. Возможно, в следующем месяце весь процесс проверки сводится к простому звонку REST.

  2. Производительность. Обычно услуги не нужны за пределами одного метода. DI требует, по меньшей мере, переменной поля для каждой службы, и на нее ссылаются, пока объект хоста жив. Если у службы есть условия для каждого клиента, это очень плохо. Я не чувствительный к производительности парень, но это просто неправильно.

  3. Кодирование для производственной среды сделана более твердой. Подумайте, сколько еще кода котельной плиты вы добавили для использования DI, каждый раз, когда вам нужна услуга. Все это во имя облегчения тестирования. Прежде всего - что ?! Производство является первым приоритетом; тестирование должно работать на него и с ним, а не наоборот. Тестирование - это не религия, люди! Фокус на производственной среде, беспокоиться о тестировании позже. Второе - тестирование действительно проще сейчас?

  4. При тестировании вам нужно только издеваться над несколькими услугами, которые являются тяжелыми и включают в себя действия вне VM. С помощью локатора служб у вас есть тестовая конфигурация, содержащая эти макетные службы, и все готово.Процесс проверки может быть протестирован без каких-либо хлопот, а также со всеми классами, которые зависят от этих услуг. В DI вы должны вручную управлять этими зависимостями, в каждый единичный тест. -Но! Но с DI у вас есть гибкость предоставления различных макет почтовых услуг для разных тестовых блоков сейчас! О, хорошо для вас!

  5. «DI поощряет единую конфигурацию обслуживания» - , только если вы используете ту же структуру. На самом деле это не имеет никакого отношения к DI; структура обеспечивает один из способов настройки, вы также можете утверждать, что Spring поощряет единый способ поиска. Когда структура становится широко используемой, она может стать стандартом де-факто, поэтому разные разработчики легче разговаривают друг с другом - только потому, что сетевой эффект, а не что-то по своей сути хороший выбор.

В заключение, это плохо для дизайна, плохого для производительности, плохого для производства, плохого для тестирования и не имеет значения для установления стандартов. Для чего это? Это похоже на множество немых правил и условностей, давно установленных сомнительным происхождением, но мы по-прежнему следим за ними вслепую каждый день. Вот что заставляет общество ходить.

редактировать: прямая линия связь на новый вопрос, касающийся DI и тестирование Does using annotations to inject dependencies remove the main benefit of dependency injection(external configuration)?

+0

хорошие комментарии, чувак! – cometta

+2

Сетки не являются обязательными (т.е. автоматическая проводка). Без них вы не можете помещать макет объекта, чтобы на самом деле проверить свой код, поэтому выбор - это тестируемость и набор шаблонов? Шутки в сторону? Ваши взгляды на влияние DI на производительность в лучшем случае наивны. Я не знаю, получишь ли ты -20 для этого ответа ... ну, я не могу говорить за другого -18. – cletus

+0

Производительность: Обычно я не подсчитываю байты и миллисекунды, но объявление объекта за пределами используемой области делает меня неудобным. только если инфраструктура DI может внедрить сервис в локальную переменную метода! подождите, пока он уже существует, он называется локатором службы. – irreputable

6

Выполнение applicationContext.getBean() полностью нарушает назначение зависимой инъекции, потому что вы больше не зависите от инъекций. XML-файл контекста приложения отлично. Конфигурация на основе аннотаций (автоматическая проводка) также прекрасна. Таким образом, вы можете также делать:

Service service = new Service(); 

или хуже:

Service service = ServiceLocator.locate("service"); 

Оба, которые делают ваш код трудно проверить.

+0

@cletus, вы можете прокомментировать, используя applicationcontextaware в этой статье http://tinyurl.com/ycrdnsa по сравнению с традиционным способом применения. getbean? – cometta

+2

Почему вы говорите «Сервис-сервис = ServiceLocator.locate (« service »)' хуже, чем «Service service = new ServiceImpl()» (я предполагаю, что это то, что вы имели в виду, иначе DI все равно бессмысленно)? Я часто использую локаторы сервисов во всем коде; Я бы, наверное, с ума сошел прямо с помощью инъекционных услуг на каждую страницу пользовательского интерфейса. Реализации локатора легко подключаются (контекстно-зависимые и смеются); Я честно не понимаю, как использование локаторов делает тестирование труднее. – ChssPly76

+0

это затрудняет работу, если они не могут быть легко подключены. это звучит так, как будто они вставляются в * вашу * реализацию –

Смежные вопросы