Подтвердить что ты не робот

Кто-нибудь имеет хорошую аналогию для инъекций зависимости?

Я прочитал много статей о Dependency Injection, а также просмотрел множество видеороликов, но я все еще не могу оторвать его. Кто-нибудь имеет хорошую аналогию, чтобы объяснить это?

Я смотрел первую часть осени Agile screencast и все еще был немного смущен.

4b9b3361

Ответ 1

Аналогия? Я дам ему удар... Ваша стереосистема для проигрывателя компакт-дисков бесполезна без компакт-диска с музыкой на нем... (зависит от компакт-диска). Если бы они создали CD-плееры с уже записанным компакт-диском, это очень быстро стало бы скучным...

Таким образом, они создают их, поэтому вы можете "вставлять" компакт-диск (на котором он зависит) в плеер. Таким образом, вы можете каждый раз вводить разные слова и получать "другое" поведение (музыку), зависящее от того, какой вы вводите.

Единственное требование - компакт-диск должен быть совместим с интерфейсом, определенным игроком. (Вы не можете воспроизводить диск с синим лучом в проигрывателе 1992 года.)

Ответ 2

Лучшая аналогия, о которой я могу думать, - это наем механика.

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

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

Ответ 3

Подумайте об этом как о реализации шаблона "Обращение управления". Я думаю, ваша проблема в том, что вы так привыкли к этому, вы не понимаете, что это просто.

Пусть начнется в начале.

В первые дни программы выполняли заданный путь через код. Порядок вызываемых функций задавался программистом.

В интерактивных программах, например. в основном ЛЮБОЙ программы, вы не можете сказать, какую функцию вызывать в какое время. Просто посмотрите на графический интерфейс или веб-сайт. Вы не можете сказать, в какое время нажата кнопка или ссылка. Таким образом, "контроль" того, что происходит, больше не находится в программе, он находится во внешнем источнике. "Контроль" был инвертирован. Функция больше не "действует", а вместо этого "слушает". Подумайте о голливудском принципе: "Не звоните нам, мы вам звоним". Слушатель - хороший пример для реализации этого шаблона.

IoC реализуется функциями или "методами" в "объектно-ориентированном мире" сегодняшнего дня.

"Инъекция зависимостей" теперь означает то же самое, но не для "методов", которые делают что-то, но для "объектов", которые содержат данные.

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

Итак, на поле для гольфа ее игра будет сильно зависеть от одного клуба, который она несет.

К счастью для нее, есть кадди, где есть много клубов за один раз, а также знание того, какой клуб использовать в какое время. Теперь она не зависит от ее ограниченной возможности носить гольф-клубы. "Не думайте о конкретном клубе, чтобы носить, мы знаем их всех и даем вам правильный в нужное время".

Кинозвезда - это объект, и гольф-клубы являются членами объекта. Эта инъекция зависимостей.

Ответ 4

Может быть, сосредоточиться на части "инъекции"? Когда я вижу этот термин, я думаю о шприцах. Процесс подталкивания зависимостей компонента к компоненту можно рассматривать как впрыскивание в компонент.

Точно так же, как с телом, когда есть что-то, что ему нужно в медицине (компонент, который ему нужен), вы можете вводить его в тело.

Ответ 5

В своей презентации JavaPolis в 2003 году (слайды), Джон Тирсен и Аслак Хеллесёй имели забавную аналогию с объектом Girl, который нуждается в Boy поцеловать. Кажется, я помню, что BoyFactory иногда называют "ночным клубом", но это не в слайдах.

Ответ 6

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

На этом этапе вам необходимо внести следующие изменения: обновите контактные данные (и другие материалы), чтобы использовать нового продавца. Вы по-прежнему размещаете заказ напрямую.

Теперь рассмотрим, что мы вводим новый шаг между ними, есть сотрудник "библиотеки" в компании, и вам нужно пройти через него, чтобы получить книги. В то время как есть новая зависимость, вы теперь невосприимчивы к каким-либо изменениям продавца: либо продавец меняет способ оплаты, либо сам продавец изменен, теперь вы просто отдаете приказ библиотекарю, и он получает книги для вас.

Ответ 7

Из первых шаблонов дизайна:

Помните, что код должен быть закрыт (чтобы измениться), как цветок лотоса вечером, но открыт (к расширению), как цветок лотоса по утрам

Объект, поддерживающий DI, может быть настроен путем ввода поведения, определенного в других классах. У исходной структуры объекта нет изменений, чтобы создать множество вариантов. Впрыск можно сделать явным, если в его конструкторе задан класс других рабочих классов, или это может быть менее очевидным при использовании monkeypatching в динамических языках, таких как Python.

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

Ответ 8

Волшебник ловкость руки! То, что вы думаете, что видите, может быть тайно манипулировано или заменено.

Ответ 9

Жизнь полна аналогов инъекций зависимостей:

  • принтер - картридж
  • цифровое устройство - аккумулятор
  • письмо - штамп
  • музыкант - инструмент
  • драйвер шины
  • болезнь - таблетка

Ответ 10

Суть инверсии управления (из которой Инъекция зависимостей является реализацией) - это разделение использования объекта от его управления.

Используемый аналог/пример - это движок. Двигатель требует топлива для запуска, то есть он зависит от топлива. Однако двигатель не может нести ответственность за топливо, в котором он нуждается. Он просто "спрашивает" о топливе, и он предоставляется (как правило, топливным насосом в автомобиле).

Аналогия начинает разрушаться, когда вы смотрите слишком глубоко, так как двигатель не запрашивает топливо, ему предоставляется какой-то элемент управления, например, ECU. Можно сравнить ECU с контейнером, но я не уверен, насколько это справедливо.

Ответ 11

Менеджер проекта попросит вас написать приложение.

Вы могли бы просто написать код, основанный на вашем опыте карьеры, но вряд ли это будет вашим PM.

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

Лучше, если вам сказали, где находится исходный репозиторий.

Лучше, если вам скажут, что такое техническая платформа.

Лучше, если вам сказали, когда это нужно сделать.

Etc..

Ответ 12

Я думаю, что большая аналогия - шестилетний ребенок с набором lego.

Вы хотите, чтобы ваши объекты были похожи на кирпичи lego. Каждый из них независим от всех остальных, но предлагает четкий интерфейс для подключения к другим. Соединяя их вместе, на самом деле не имеет значения, какие два кирпича вы соединяете друг с другом, если у них есть соответствующий интерфейс.

Ваша инфраструктура инъекции зависимостей похожа на шестилетнюю. Он следует инструкциям (т.е. Ваш файл конфигурации, аннотации и т.д.), Чтобы связать определенные кирпичи определенным образом, чтобы создать определенную модель.

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