Як введення залежності не просто перенесення складності в окремий клас?


9

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

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


6
Через десятиліття я очікую, що DI візьме переломний список від Singleton, але цього разу з поважних причин. Він має корисні результати, але я пропоную дуже ретельно оцінювати їх вплив.
Balog Pal

5
Я не думаю, що введення залежності - це спосіб зменшити складність, але спосіб уникнути неявних залежностей (використання глобальних символів / вільних змінних) на користь явних залежностей (використовувати явні параметри / зв'язані змінні). Отже, складність все-таки є, але ви змушені з цим розібратися, тому що ви робите це явним підписом у методі / конструкторі.
Джорджіо

7
Зауважте, що майже будь-яка система організації коду може бути описана як "просто переміщення складності кудись інше". Мова йде не про те, щоб зняти складність настільки, як організувати її найбільш логічним, корисним способом.

1
Якщо вам доведеться імпортувати 50 заголовків, ви повинні це зробити десь. DI допоможе вам простішим способом тестування коду.
BЈоviћ

2
Отже, ви кажете, що зараз ваш контролер зосереджений на контролі, а фабрика імпорту заголовка зосереджена на імпорті заголовків? Як це може колись бути поганим, використовуєте ви рамку DI чи ні?
пдр

Відповіді:


16

Введення залежностей просто допомагає визначити, як один об'єкт знає про інший залежний об'єкт. Це не допоможе вам зменшити загальну складність системи. Якщо вам потрібні були десятки імпорту до DI, вам все одно знадобляться десятки імпорту після. Різниця полягає в тому, що цей імпорт буде в тому місці (класі), яке має більше сенсу (фабрика, виробник тощо).

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

Існує кілька принципів, які схожі і часто використовуються разом: впорскування введення (DI), інверсія управління (IoC) та принцип інверсії залежності (DIP)

З цієї статті http://martinfowler.com/articles/dipInTheWild.html

DI - про проводку, IoC - про напрямок, а DIP - про форму


2
+1, для останньої цитати. Це найкраще уточнення цих 3 понять, які люди часто неправильно розуміють.
хайлем

Пов'язана стаття вище справді видатна. Досить глибоке і дуже чітке пояснення.
DemetriKots

10

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

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

Ви повинні уникати "гумористичних" занять, періоду. Отже, скажімо, ви розділили контролер перегляду на більш дрібні, більш ремонтовані класи. Тепер усі вони нестимуть відповідальність за власну залежність. DI допомагає перенести це управління залежністю з усіх цих класів у заводський / конфігураційний клас, який відповідає лише за управління залежностями - див. Принцип єдиної відповідальності. І хоча це, звичайно, буде набагато менш "гумористично", ніж оригінальний контролер перегляду, якщо він стає занадто великим, у вас завжди є можливість розділити його на менші класи управління залежностями, які відповідають за різні частини програми.


2

Словами мирянина:

Ін'єкційна залежність переміщує складність туди, де вона менше шкодить.

EDIT для @gnat: DI - це не просто переміщення складності до окремого класу, а перенесення його туди, де він заподіює меншу шкоду.


як це відповідає на поставлене запитання?
гнат

@gnat додав редагування, моя відповідь пояснює, на мою думку, як DI не просто переносить складність в окремий клас.
Tulains Córdova
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.