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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

Это делает наш класс Car независимым от создания объектов Wheels, Battery и т. Д.

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

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

Итак, теперь ответственность за внедрение зависимостей состоит в следующем:

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

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

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

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

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

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

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

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

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

Недостатки DI

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

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

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

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

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

Внедрение зависимостей Java - Учебное пособие по образцу шаблона проектирования DI - JournalDev

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

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

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

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

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

Изменить 1:

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

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

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

Ди-ниндзя

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

нож

Изменить 2:

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

аурин

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

Если вы узнали хоть что-то, поделитесь, пожалуйста, этой историей!