Найти в Дзене

Внедрение зависимостей: что это такое и как работает

Сегодня хотим поделиться с вами находкой - видео от Anthony Ferrara, автора канала о программировании, PHP и Computer Science "Programming with Anthony".

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

Перевод:

Что такое внедрение зависимостей? Чтобы ответить на этот вопрос, разберёмся с понятием зависимости. Зависимость — это объект, который необходим, чтобы созданный вами класс работал.
Представьте, что создали объектную модель, которая получает данные из объекта в базе данных. Можно сказать, что у объектной модели есть зависимость от объекта в базе данных.
Мы определили, что такое зависимость. Теперь разберёмся, что значит внедрение зависимости. Термином «внедрение зависимости» обозначают добавление внешней зависимости в класс. Это значит, что вам не нужно подтверждать зависимости при использовании нового оператора внутри класса.
Вместо этого укажите её в параметрах конструктора или с помощью сеттера. Это всё, что необходимо для внедрения зависимости. Вам не понадобится сложный контейнер, новый класс или объект. Конечно, новый контейнер или объект могут показаться более простым способом решения задачи. Но они вам не нужны.
Почему внедрение зависимости стоит рассматривать в первую очередь? Представьте, что программируете робота-строителя. У вас есть уложенные штабелями доски. Вы программируете робота, чтобы он делал из досок стены.
Что вы сделаете, если нужно установить в дверной проём дверь? Вы запрограммируете робота, чтобы он каждый раз делал из досок дверь? Или вы возьмёте готовую дверь у производителя дверей и научите робота устанавливать её в дверной проём?
Наиболее гибкий подход — взять готовое изделие у производителя дверей. Именно это делает внедрение зависимости. Этот инструмент отделяет процесс создания классов от создания зависимостей. Почему это важно? На этот вопрос отвечает принцип инверсии зависимостей.
Принцип инверсии зависимостей определяет, что код должен зависеть от абстракций. Зависимость от абстракций отделяет имплементации модулей друг от друга. В PHP это значит, что код должен зависеть от интерфейсов. Это позволяет заменять зависимости, если интерфейс позволяет делать это.
Внедрение зависимостей отделяет код от модулей нижнего уровня. Это делает код чистым, расширяемым и подходящим для повторного использования.
Мы разобрались с внедрением зависимости, но есть ещё одна проблема. Каждому классу для работы нужны все использованные в коде зависимости. Чтобы спроектировать каждый класс, нам нужно определить, какие зависимости он использует. Также нужно определить, как подтвердить зависимости.
К счастью, решение есть. Это контейнер внедрения зависимостей. По сути, контейнер представляет собой карту зависимостей, которые использует класс, с логикой создания зависимостей, если они ещё не созданы.
Каждый раз, когда вы запрашиваете зависимость, контейнер определяет, какую зависимость использовать. Затем он проверяет, создана ли эта зависимость. Если это так, будет использована существующая зависимость. Если нет, контейнер создаст зависимость, сохранит и вернёт её.
То есть вместо создания всех классов собственноручно вы делегируете это контейнеру. Контейнер внедрения зависимостей создаёт объект и возвращает его. Важно, что контейнер обрабатывает сложные зависимости прозрачно. Если вы хотите поменять общую зависимость, вам нужно просто обновить контейнер.
Итак, чтобы ваш код был более чистым и модульным, используйте внедрение зависимостей.