Чому модель введення залежності не була включена до групи банди з чотирьох?


37

Чому модель введення залежності не була включена в групу з чотирьох ? Чи був GOF раніше широко поширеним автоматизованим тестуванням? Чи в даний час введення залежності вважається основною схемою?


18
.. тому що "Введення залежності" не є зразком!
Діпан Мехта


14
Все, що повторюється, утворює зразок повторення. Усі елементи дизайну (які не є унікальними, божевільні ідеї) - це "візерунки".
S.Lott

3
Ці довгі відповіді, ймовірно, вводять в оману, оскільки вони начебто підтверджують питання. Хоча, як було сказано, введення залежності не є схемою дизайну. Це "механізм" для створення об'єктів, як правило, який обробляється рамкою.
Назар Мерза

1
Введення залежностей - це закономірність . Він протистоїть схемі пошуку локалів. Прочитайте Фаулера, який придумав цей термін. Я абсолютно не маю уявлення, як стільки людей протистояли такої дурниці.
Джеймс

Відповіді:


101

Я був редактором журналу « Розробка програмного забезпечення », коли вийшла книга «Банда чотирьох», і я можу з повною впевненістю сказати, що тестування одиниць не було поширеною практикою в 1994 році, коли спочатку були опубліковані шаблони дизайну .

У 1994 році C ++ була найбільш часто використовуваною об'єктно-орієнтованою мовою, і більшість людей, які її програмували, походили з C. Однією з речей "мислення в об'єктах", яких у людей просто не було, є ідея сотень чи тисяч вхідних точок у вашу програму. Ви думали про те main(). Якщо ви працювали над великим проектом, у вас може виникнути (як правило, досить складний) makefile для створення програми на основі модулів. Але "одиничне тестування"? Починати процес, будувати необхідний контекст пам'яті, виконувати його та зривати на основі методу ? Це було дуже радикально.

Java зробила програмування декількох точок вступу більш очевидним. На момент початкового буму Dot-Com, тестування одиниць була добре відомою методикою, але саме JUnit (приблизно 2001?) Змусило її загорітися і стала загальною практикою.

Хоча Стратегія та загальна концепція програмування інтерфейсу були частиною GoF та сейтгейсту середини 90-х, ідея ін'єкції прийшла досить пізно до партії (приблизно '03 -'05?). Чесно кажучи, мої сиві волоски все ще досить сумнівні щодо цього аспекту DI ("Геть з моєї галявини, ти, чорт, конфігураційні файли!").


17
Я шкодую, що за такий проникливий варіант відповіді маю лише один голос.

@Larry OBrien: сканування реєстрацій на основі конвенції значно спрощує код конфігурації і практично виключає конфігурацію xml в контейнерах ioc.
квентин-зірин

4
Я хотів би додати, що введення залежності в його суть взагалі не покладається на файли конфігурації. Ви можете зробити це все вручну, що робить його дуже простим у використанні та все ще дуже гнучким підходом.
marco-fiset

31

Вони назвали це стратегією .

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


16
-1. Вибачте! Шаблон стратегії не має нічого спільного з введенням залежності.
Діпан Мехта


14
@Dipan: перед тим, як піти на оскарження цього питання, краще подумайте над відповіддю п’ять хвилин.
Док Браун

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

8
DI - це більше креативний візерунок. Він створює та вводить стратегії. Сказати, що це стратегія - це лише половина правди. DI - це більше мікроядра! Я не можу повірити, що люди підтримують це. Стратегія скоріше нагадує рису доброго DI, а не необхідності.
Сокіл

0

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

Стратегія може бути обговорена, але стратегія не говорить про введення залежності. Але при використанні шаблону стратегії в одному проекті або dll (усі класи та інтерфейси залишаються в одному проекті) виявляється, що ми робимо ін'єкцію залежності. Насправді ми це не так.

Тепер, якщо класи та інтерфейси, згадані в шаблоні стратегії, розділені в різних проектах або рівнях, то МИ повинні будуть використовувати методи введення залежності. Ми могли б використовувати файли конфігурації єдності (однак не можлива зміна часу виконання). Але схема стратегії не говорить про те, як ввести залежність.

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


2
Це не відповідає на запитання. Прочитайте оригінальне запитання замість того, щоб відповідати на інші відповіді :)
Андрес Ф.

-4

відповідь Стратегія на 100% правильна. Я проголосував за це, але можу прокоментувати.

"Стратегія дозволяє алгоритму змінюватись незалежно від клієнтів, які його використовують. [1] Стратегія є однією з моделей, включених у впливову книгу" Шаблони дизайну "Гамми та ін., Яка популяризувала концепцію використання шаблонів для опису дизайну програмного забезпечення."

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

Шаблон сховища не є новим шаблоном, це шаблон шаблону.

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

Часто шаблони є декількома візерунками, об'єднаними та названими такими як MVC.

У GOF не було інтерфейсів використовуваних класів Pure Abstract, а також скористалася здатністю C ++ успадковувати більше ніж один клас.


1
Призначення шаблону абсолютно важливе для розрізнення. Серед моделей GoF - Адаптер та Проксі - хороші приклади - вони мають однакову форму, але різну мету. Я також не погоджуюся з вашим твердженням, що DI реалізується за допомогою стратегії; Стратегія більш конкретна за своїм призначенням та способом використання налаштованого об'єкта, тому більш розумним є те, що стратегія реалізується разом із DI.
Жуль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.