Почему шаблон внедрения зависимости не был включен в Банду четырех?

37

Почему шаблон внедрения зависимостей не был включен в группу из четырех человек ? GOF предшествовал широкому распространению автоматизированного тестирования? Считается ли внедрение зависимостей основным шаблоном?

Том Сквайрс
источник
18
.. потому что «Внедрение зависимости» - это не шаблон!
Дипан Мехта
1
@DipanMehta stackoverflow.com/questions/823387/…
Том Сквайрс
14
Все, что повторяется, образует образец повторения. Все элементы дизайна (которые не являются уникальными, сумасшедшими идеями) являются «шаблонами».
S.Lott
3
Эти длинные ответы, вероятно, вводят в заблуждение, поскольку они как бы обосновывают вопрос. Хотя, как уже упоминалось, внедрение зависимостей не является шаблоном проектирования. Это «механизм» для создания объекта, обычно обрабатываемый платформой.
Назар Мерза
1
Внедрение зависимостей - это закономерность . Это противоположно шаблону Service Locator. Читайте Фаулера, который придумал этот термин. Я понятия не имею, как много людей поддержали такую ​​ерунду.
Джеймс

Ответы:

101

Я был редактором журнала Software Development, когда вышла книга «Банды четырех», и я могу с полной уверенностью сказать, что модульное тестирование не было широко распространенной практикой в ​​1994 году, когда первоначально были опубликованы шаблоны проектирования .

В 1994 году C ++ был наиболее часто используемым объектно-ориентированным языком, и большинство людей, программирующих его, исходили из языка Си. Одной из вещей «мышления в объектах», которых просто не было у людей, является идея сотен или тысяч точек входа в вашу программу. Вы думали о main(). Если вы работали над большим проектом, у вас может быть (обычно довольно сложный) make-файл для создания программы на основе модулей. Но "юнит-тестирование"? Запуск процесса, создание необходимого контекста памяти, его выполнение и разрушение для каждого метода ? Это было очень радикально.

Java сделала программирование с несколькими точками входа более очевидным. Ко времени первоначального бума в Dot-Com модульное тестирование было общеизвестной техникой, но именно JUnit (около 2001 года?) Заставил его загореться и стать универсальной практикой.

Хотя стратегия и общая концепция программирования интерфейса были частью GoF и духом времени середины 90-х, идея внедрения пришла довольно поздно (около 03–05?). Честно говоря, мои седые волосы все еще довольно сомнительны в отношении этого аспекта DI («Убирайся с моей лужайки, черт возьми, файлы конфигурации!»).

Ларри Обриен
источник
17
Я сожалею, что у меня есть только один голос за такой проницательный ответ.
@Larry OBrien: сканирование для регистрации на основе соглашений значительно упрощает код конфигурации и практически исключает конфигурацию xml в контейнерах ioc.
Квентин Старин
4
Я хотел бы добавить, что внедрение зависимостей по своей сути совсем не зависит от файлов конфигурации. Вы можете сделать все это вручную, что делает его очень простым в использовании и все еще очень гибким.
marco-fiset
31

Они назвали это Стратегией .

Их стратегия, кажется, имеет все особенности внедрения зависимостей без комплексного названия.

С. Лотт
источник
16
-1. Сожалею! Шаблон стратегии не имеет ничего общего с внедрением зависимостей.
Дипан Мехта
14
@Dipan: перед тем, как понизить это, лучше подумайте об ответе через пять минут.
Док Браун
6
Это правда, что внедрение зависимостей можно считать очень похожим на шаблон стратегии, но когда люди говорят, что внедрение зависимостей, они обычно имеют в виду инверсию контроля, которая, на мой взгляд, намного отличается от стратегии (особенно контейнер IoC).
MattDavey
8
DI - это скорее творческий паттерн. Это создает и вводит стратегии. Сказать, что это стратегия - это только половина правды. DI - это скорее образец микроядра! Я не могу поверить, что люди высказывают это. Стратегия больше похожа на черту хорошего DI, а не на необходимость.
Сокол
0

Я думаю, что Dependency Injection более актуально при разделении реализации по уровням. Еще одна область, где мы думаем о внедрении зависимостей, это модульное тестирование. И ваше предпоследнее предложение кажется правильным. Если банда будет собирать и разделять шаблоны в 2012 году, то определенно произойдет внедрение зависимости.

Стратегия может обсуждаться, но в Стратегии не говорится о внедрении зависимости. Но при использовании шаблона стратегии в одном проекте или dll (все классы и интерфейсы остаются в одном проекте), оказывается, что мы внедряем зависимости. На самом деле мы не.

Теперь, если классы и интерфейсы, упомянутые в шаблоне стратегии, разделены в разных проектах или уровнях, тогда МЫ должны будем использовать методы внедрения зависимостей. Мы могли бы использовать файлы конфигурации для единства (однако изменение во время выполнения невозможно). Но шаблон Стратегии не говорит о том, как ввести зависимость.

Если существует шаблон, который очень похож на внедрение зависимостей, то это шаблон Абстрактного фабричного метода. Этот шаблон можно использовать внутри шаблона стратегии для внедрения зависимости.

Синие облака
источник
2
Это не отвечает на вопрос. Пожалуйста, прочитайте оригинальный вопрос вместо того, чтобы отвечать на другие ответы :)
Andres F.
-4

Стратегия ответа на 100% правильная. Я проголосовал за это, но могу прокомментировать.

«Стратегия позволяет алгоритму варьироваться независимо от клиентов, которые его используют. [1] Стратегия - это один из шаблонов, включенных во влиятельную книгу« Шаблоны проектирования »Гаммы и др., Которая популяризировала концепцию использования шаблонов для описания разработки программного обеспечения».

Шаблон дизайна не зависит от его использования. Внедрение зависимостей осуществляется с помощью шаблона «Стратегия». Если бы мы назвали каждый шаблон в зависимости от варианта использования, нам пришлось бы переименовать множество шаблонов.

Шаблон репозитория - это не новый шаблон, это шаблон шаблона.

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

Часто шаблоны представляют собой несколько шаблонов, объединенных и названных, например, шаблон MVC.

GOF не имел интерфейсов используемых классов Pure Abstract, а также использовал способность C ++ наследовать от нескольких классов.

Тренер Дэвид
источник
1
Цель картины абсолютно важна в различении. Среди паттернов GoF хорошим примером являются Adapter и Proxy - они имеют одинаковую форму, но разное назначение. Я также не согласен с вашим утверждением, что DI реализован с использованием стратегии; Стратегия более конкретна по своему назначению и способу использования сконфигурированного объекта, поэтому более разумно сказать, что стратегия реализована с помощью DI.
Жюль