Кратко въведение в инжектирането на зависимост: какво е и кога да го използвам

Въведение

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

Това е дефиницията на Уикипедия, но все пак, но не е особено лесно да се разбере. Така че нека го разберем по-добре.

Преди да разберем какво означава това в програмирането, нека първо видим какво означава това като цяло, тъй като ще ни помогне да разберем по-добре концепцията.

Зависимост или зависим означава да разчитате на нещо за подкрепа. Като ако кажа, че разчитаме твърде много на мобилни телефони, отколкото означава, че зависим от тях.

Така че, преди да стигнете до инжекции на зависимост , първо нека разберем какво означава зависимост в програмирането.

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

В Java, преди да можем да използваме методи на други класове, първо трябва да създадем обекта на този клас (т.е. клас А трябва да създаде екземпляр на клас Б).

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

Защо трябва да използвам инжектиране на зависимост?

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

Тук класът автомобили е отговорен за създаването на всички обекти на зависимостта. Какво ще стане, ако в бъдеще решим да се откажем от MRFWheels и искаме да използваме Yokohama Wheels?

Ще трябва да пресъздадем автомобилния обект с нова зависимост от Йокохама. Но когато използваме инжектиране на зависимости (DI), можем да променим колелата по време на изпълнение (защото зависимостите могат да се инжектират по време на изпълнение, а не по време на компилиране).

Можете да мислите за DI като посредник в нашия код, който извършва цялата работа по създаването на предпочитания обект на колела и предоставянето му на класа Car.

Това прави нашия клас Car независим от създаването на обекти на джанти, батерия и т.н.

По принцип има три вида инжектиране на зависимост:

  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)
  • Castle Windsor (.NET)
  • Единство (.NET)

За да научите повече за инжектирането на зависимости, можете да разгледате следните ресурси:

Инжектиране на зависимостта на Java - Урок за пример на шаблон за дизайн на дизайн - JournalDev

Използване на инжектиране на зависимости в Java - Въведение - Урок - Vogella

Обръщане на контролни контейнери и модел на инжектиране на зависимост - Мартин Фаулър

Надявам се да помогне!

Ако статията ви е харесала и искате да прочетете още невероятни статии, следвайте ме тук (Bhavya Karia) и покажете подкрепата си, тъй като ме мотивира да пиша повече.

Ако имате някакви въпроси или отзиви за мен, нека се свържем в LinkedIn, Twitter, Facebook.

Редактиране 1:

Благодарение на Сергей Ufocoder сега тази статия е преобразувана в руски език. Моите руски приятели и всички, които могат да четат руския език, го четат.

Връзка към статията

Освен това, ако искате да приложите DI в JavaScript и търсите библиотека, тогава Jo Surikat предлага да опитате неговата библиотека.

Ди-Нинджа

Още една страхотна DI библиотека в JavaScript беше предложена от Nicolas Froidure.

мотоциклет

Редактиране 2:

Ако сте разработчик на PHP, не се притеснявайте, покрихте всички. Гордън Форсайт препоръча тази невероятна библиотека, която всички бихте искали да изпробвате.

аурин

Благодаря за всички добри думи, които получих. Споделете статията, за да могат да се възползват все повече хора.

Ако сте научили дори нещо или две, моля, споделете тази история!