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

Снимка от rawpixel в Unsplash

Въведение

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

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

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

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

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

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

Показване на зависимости между класовете

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

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

Ами ако кодът може да говори?

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

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

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

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

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

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

Основно има три вида инжектиране на зависимост:

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

И така, сега инжекционната зависимост зависи от:

  1. Създайте обектите
  2. Знайте кои класове изискват тези обекти
  3. И им предоставете всички тези обекти

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

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

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

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

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

Забележка: Ако искате да научите за принципите на 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 - Урок за пример за дизайн на DI - JournalDev

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

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

Дано помогне!

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

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

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

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

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

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

Di-нинджа

Още една страхотна библиотека за DI в JavaScript беше предложена от Никола Фродуре.

knifecycle

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

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

auryn

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

Ако сте научили дори нещо или две, ръкопляскайте колкото пъти повече (50 (), за да покажете подкрепата си!