Короткий вступ до ін’єкції залежності: що це таке, і коли її використовувати

Вступ

У програмній інженерії введення залежностей - це техніка, за допомогою якої один об'єкт (або статичний метод) забезпечує залежності іншого об'єкта. Залежність - це об’єкт, який можна використовувати (послуга).

Це визначення Вікіпедії, але все ж, але зрозуміти це не особливо просто. Тож давайте це краще зрозуміємо.

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

Залежність чи залежність означає сподівання на щось для підтримки. Як, якщо я кажу, що ми занадто покладаємось на мобільні телефони, ніж це означає, що ми від них залежні.

Отже, перш ніж переходити до ін’єкцій залежностей , спершу давайте зрозуміємо, що означає залежність у програмуванні.

Коли клас A використовує деяку функціональність класу B, тоді він сказав, що клас A має залежність від класу B.

У Java, перш ніж ми можемо використовувати методи інших класів, нам спочатку потрібно створити об'єкт цього класу (тобто клас А повинен створити екземпляр класу B).

Отже, передача завдання створення об’єкта комусь іншому та безпосереднє використання залежності називається ін’єкцією залежності.

Чому я повинен використовувати ін’єкцію залежності?

Скажімо, у нас є клас автомобілів, який містить різні предмети, такі як колеса, двигун тощо.

Тут клас автомобілів відповідає за створення всіх об’єктів залежностей. А що, якщо ми вирішимо в майбутньому відмовитись від MRFWheels і захочемо використовувати колеса Yokohama ?

Нам потрібно буде відтворити об’єкт автомобіля з новою залежністю від Йокогами. Але використовуючи інжекцію залежностей (DI), ми можемо змінити колеса під час виконання (оскільки залежності можна вводити під час виконання, а не під час компіляції).

Ви можете уявити DI як посередника в нашому коді, який виконує всю роботу зі створення бажаного об’єкта коліс і надання його класу Car.

Це робить наш клас Автомобіль незалежним від створення об’єктів Колеса, Акумулятора тощо.

В основному існує три типи введення залежності:

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

Отже, зараз відповідальність ін’єкції залежності:

  1. Створіть об'єкти
  2. Знайте, для яких класів потрібні ці об’єкти
  3. І забезпечити їх усіма цими об’єктами

Якщо є якісь зміни в об'єктах, тоді DI розглядає це, і це не повинно стосуватися класу, що використовує ці об'єкти. Таким чином, якщо об’єкти змінюватимуться в майбутньому, то обов’язок його DI надавати відповідні об’єкти класу.

Інверсія контролю - концепція, що лежить в основі DI

Це говорить про те, що клас не повинен конфігурувати свої залежності статично, а повинен бути налаштований якимсь іншим класом ззовні.

Це п'ятий принцип СОЛІД -п’ять основних принципів об’єктно-орієнтованого програмування та дизайну Дядьком Боб - який стверджує, що клас повинен залежати від абстракції, а не від конкретики (простіше кажучи, жорстко закодований).

Відповідно до принципів, клас повинен зосередитись на виконанні своїх обов'язків, а не на створенні об'єктів, необхідних для виконання цих обов'язків. І ось тут в справу вступає введення залежностей : воно забезпечує клас необхідними об’єктами.

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

Переваги використання DI

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

Недоліки ДІ

  1. Це трохи складно вчитися, і якщо надмірне використання може призвести до проблем управління та інших проблем.
  2. Багато помилок часу компіляції витісняються до часу виконання.
  3. Структури введення залежностей реалізуються за допомогою відображення або динамічного програмування. Це може перешкодити використанню автоматизації IDE, наприклад, "знайти посилання", "показати ієрархію викликів" та безпечний рефакторинг.

Ви можете реалізувати ін’єкцію залежностей самостійно (Pure Vanilla) або використовувати сторонні бібліотеки або фреймворки.

Бібліотеки та основи, що реалізують DI

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

Щоб дізнатись більше про введення залежностей, ви можете ознайомитися з наведеними нижче ресурсами:

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

Використання інжекції залежностей у Java - Вступ - Підручник - Vogella

Інверсія контрольних контейнерів та схема введення залежності - Мартін Фаулер

Сподіваюся, це допоможе!

Якщо вам сподобалась стаття і ви хочете прочитати ще дивовижні статті, тоді йдіть за мною сюди (Bhavya Karia) і покажіть свою підтримку, оскільки це спонукає мене писати більше.

Якщо у вас є якісь запитання чи відгуки до мене, то давайте підключатись на LinkedIn, Twitter, Facebook.

Редагувати 1:

Завдяки Сергію Уфокодеру зараз ця стаття переведена на російську мову. Мої російські друзі і всі, хто вміє читати російську мову, читають її.

Посилання на статтю

Крім того, якщо ви хочете застосувати DI в JavaScript і шукаєте бібліотеку, Джо Сурікат пропонує вам спробувати його бібліотеку.

Ді-Ніндзя

Ще одну чудову бібліотеку DI в JavaScript запропонував Ніколас Фроудюре.

ножовий цикл

Редагувати 2:

Якщо ви розробник PHP, тоді не хвилюйтеся, вас також охопили. Гордон Форсайт рекомендував цю дивовижну бібліотеку, яку всі ви, можливо, захочете спробувати.

аурин

Дякую за всі добрі слова, які я отримував. Поділіться статтею, щоб все більше людей могли отримати вигоду.

Якщо ви навчилися хоч щось-два, поділіться цією історією!