У кого-нибудь есть хорошая аналогия для внедрения зависимости? - PullRequest
24 голосов
/ 08 января 2009

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

Я смотрел первую часть скриншота «Осень проворной» и все еще был немного растерян.

Ответы [ 12 ]

64 голосов
/ 08 января 2009

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

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

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

7 голосов
/ 08 января 2009

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

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

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

2 голосов
/ 08 января 2009

Думайте об этом как о реализации паттерна «инверсия контроля». Я полагаю, ваша проблема в том, что вы так привыкли к этому, что не понимаете, что это так просто.

Давайте начнем с самого начала.

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

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

IoC реализуется с помощью функций или «методов» в «объектно-ориентированном мире» сегодня.

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

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

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

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

Звезда фильма - это объект, а клюшки для гольфа - члены объекта. Это внедрение зависимости.

1 голос
/ 15 октября 2010

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

Аналогия / пример, который я использую, - двигатель. Для работы двигателя требуется топливо, т.е. оно зависит от топлива. Тем не менее, двигатель не может отвечать за топливо, которое ему нужно. Он просто «просит» топлива и предоставляется (как правило, топливным насосом в автомобиле).

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

1 голос
/ 08 января 2009

Жизнь полна аналогий внедрения зависимостей:

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

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

1 голос
/ 08 января 2009

С Шаблоны проектирования первых голов :

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

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

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

1 голос
/ 08 января 2009

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

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

Теперь представьте, что мы вводим новый шаг между: в компании есть сотрудник «библиотеки», и вам нужно пройти через него, чтобы получить книги. Несмотря на то, что появилась новая зависимость, вы теперь защищены от любых изменений в продавце: либо продавец меняет способ оплаты, либо меняется сам продавец, теперь вы просто размещаете заказ для библиотекаря, и он получает книги для вас.

1 голос
/ 08 января 2009

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

1 голос
/ 08 января 2009

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

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

...