Краткое введение в Dependency Injection: что это такое и когда его использовать

Фото от Rawpixel на Unsplash

Введение

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

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

Прежде чем понять, что это означает в программировании, давайте сначала посмотрим, что это означает в целом, поскольку это поможет нам лучше понять концепцию.

Зависимость или зависимость означает полагаться на что-то для поддержки. Например, если я скажу, что мы слишком полагаемся на мобильные телефоны, это означает, что мы зависим от них.

Поэтому, прежде чем перейти к внедрению зависимостей, сначала давайте разберемся, что такое зависимость в программировании.

Когда класс A использует некоторые функциональные возможности класса B, тогда говорят, что класс A имеет зависимость от класса B.

Отображение зависимостей между классами

В Java, прежде чем мы сможем использовать методы других классов, нам сначала нужно создать объект этого класса (то есть класс A должен создать экземпляр класса B).

Таким образом, передача задачи создания объекта кому-либо еще и непосредственного использования зависимости называется внедрением зависимости.

Что если код может говорить?

Почему я должен использовать внедрение зависимости?

Допустим, у нас есть класс автомобилей, который содержит различные объекты, такие как колеса, двигатель и т. Д.

Здесь класс машины отвечает за создание всех объектов зависимостей. Теперь, что если мы решим отказаться от MRFWheels в будущем и захотим использовать Yokohama Wheels?

Нам нужно будет воссоздать объект car с новой зависимостью Yokohama. Но при использовании внедрения зависимостей (DI) мы можем изменять Колеса во время выполнения (поскольку зависимости могут быть введены во время выполнения, а не во время компиляции).

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

Это делает наш класс автомобилей независимым от создания объектов колес, аккумулятора и т. Д.

Существует три основных типа внедрения зависимостей:

  1. внедрение конструктора: зависимости предоставляются через конструктор класса.
  2. Внедрение сеттера: клиент предоставляет метод сеттера, который используется инжектором для внедрения зависимости.
  3. внедрение интерфейса: зависимость обеспечивает метод-инжектор, который внедрит зависимость в любой переданный ей клиент. Клиенты должны реализовать интерфейс, который предоставляет метод установки, который принимает зависимость.

Так что теперь ответственность за внедрение зависимостей:

  1. Создать объекты
  2. Знать, какие классы требуют этих объектов
  3. И предоставить им все эти объекты

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

Инверсия контроля - концепция DI

Это говорит о том, что класс не должен настраивать свои зависимости статически, а должен настраиваться другим классом извне.

Это пятый принцип S.O.L.I.D - пять базовых принципов объектно-ориентированного программирования и проектирования дяди Боба - который гласит, что класс должен зависеть от абстракции, а не от конкреций (в простых терминах, жестко закодированных).

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

Примечание: если вы хотите узнать о принципах SOLID от дяди Боба, вы можете перейти по этой ссылке.

Преимущества использования DI

  1. Помогает в юнит-тестировании.
  2. Код пластины котла уменьшен, поскольку инициализация зависимостей выполняется компонентом инжектора.
  3. Расширение приложения становится проще.
  4. Помогает включить слабую связь, что важно при программировании приложений.

Недостатки DI

  1. Это немного сложно учиться, и если чрезмерное использование может привести к проблемам управления и других проблем.
  2. Многие ошибки времени компиляции помещаются во время выполнения.
  3. Платформы внедрения зависимостей реализованы с помощью рефлексии или динамического программирования Это может препятствовать использованию автоматизации IDE, такой как «поиск ссылок», «показать иерархию вызовов» и безопасный рефакторинг.

Вы можете внедрить внедрение зависимостей самостоятельно (Pure Vanilla) или использовать сторонние библиотеки или фреймворки.

Библиотеки и фреймворки, которые реализуют DI

  • Весна (Ява)
  • Google Guice (Java)
  • Кинжал (Java и Android)
  • Замок Виндзор (.NET)
  • Единство (.NET)

Чтобы узнать больше о внедрении зависимости, вы можете проверить следующие ресурсы:

Инъекция зависимостей Java - пример шаблона проектирования DI - JournalDev

Использование внедрения зависимостей в Java - Введение - Учебник - Vogella

Инверсия управляющих контейнеров и шаблон внедрения зависимостей - Мартин Фаулер

Надеюсь, это поможет!

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

Если у вас есть какие-либо вопросы или отзывы для меня, то давайте подключаться на LinkedIn, Twitter, Facebook.

Изменить 1:

Благодаря Сергею Уфокодеру теперь эта статья переведена на русский язык. Мои русские друзья и все, кто умеет читать по-русски, читают.

Ссылка на статью

Кроме того, если вы хотите применить DI в JavaScript и ищете библиотеку, то Джо Сурикат предлагает вам попробовать его библиотеку.

Ди-ниндзя

Еще одна потрясающая библиотека DI на JavaScript была предложена Николасом Фройдуром.

knifecycle

Изменить 2:

Если вы - разработчик PHP, не волнуйтесь, вас всех тоже охватят. Гордон Форсайт порекомендовал эту удивительную библиотеку, которую вы все могли бы попробовать.

Auryn

Спасибо за все добрые слова, которые я получаю. Делитесь статьей, чтобы все больше людей могли получить пользу.

Если вы узнали хотя бы одну вещь или две, хлопайте в ладоши столько раз (50 ), сколько сможете, чтобы показать свою поддержку!