Принцип інве́рсії зале́жностей (англ. Dependency Inversion Principle, DIP) — один з п'яти SOLID-принципів об'єктно-орієнтованого проєктування програм, суть якого полягає у розриві зв'язності між програмними модулями вищого та нижчого рівнів за допомогою спільних абстракцій.
Принцип формулюється наступним чином:
- Модулі вищого рівня не повинні залежати від модулів нижчого рівня. Обидва типи модулів повинні залежати від абстракцій.
- Абстракції не повинні залежати від деталей реалізації. Деталі реалізації повинні залежати від абстракцій.
Принцип інверсії залежностей вирішує проблеми невдалого проєктування програм.
Залежність від абстракцій
Щоб уникнути іншої залежності, крім залежності від абстракцій, потрібно:
- Усі змінні-члени класу повинні бути або абстрактними або інтерфейсами;
- Класи не повинні успадковуватись від не абстрактних класів;
- Методи не повинні заміщати методи реалізації;
- Усі модулі класів повинні приєднуватись через модулі інтерфейсів/абстрактних класів;
- Усі об'єкти повинні створюватись через твірні шаблони: фабричний метод чи фабрику чи через бібліотеки впровадження залежностей.
Проблеми невдалого проєктування програм
Роберт Мартін у своїй статті The Dependency Inversion Principle навів критерії, за якими, на його думку, можна визначити невдало спроєктовану програму.
Програма, або її частина, яка виконує своє призначення і в той самий час має одну або декілька наступних особливостей, є невдало спроєктованою:
- У програму, або її частину, складно внести зміни, оскільки будь-яка зміна впливає на занадто велику кількість компонентів системи (жорсткість).
- При внесенні змін порушується робота компонентів системи у несподіваних місцях (крихкість).
- Складно використати той самий код у іншій програмі, оскільки його неможливо витягти з даної програми (непорушність).
Програма спроєктована жорстко, якщо у неї не можна легко внести зміни. Така жорсткість обумовлена тим фактом, що одна єдина зміна до тісно взаємозв'язаного коду дає початок послідовності змін в залежних модулях. Якщо дизайнери або розробники не здатні визначити межі тієї послідовності змін, вплив цих змін неможливо спрогнозувати. А отже і наслідки цих змін спрогнозувати неможливо. Керівники проєктів, які стикаються з подібною непередбачуваністю, неохоче погоджуються на впровадження змін. Тому такий дизайн офіційно визнається жорстким.
Крихкість означає схильність програми до виникнення помилок у багатьох місцях після внесення хоча б однієї правки. Часто буває, що проблеми виникають у місцях, які не мають концептуального відношення до місця, якого стосувалась правка. Така крихкість знижує довіру до організації, що займалася проєктуванням та розробкою програми. Користувачі та керівники проєктів не можуть передбачити якість їх продукту. Прості зміни, внесені до однієї частини програми, призводять до збоїв у роботі зовсім не пов'язаних з нею інших частин програми. Спроби виправити це призводять до виникнення ще більших труднощів, і процес підтримки продукту починає нагадувати собаку, що бігає за власним хвостом.
Дизайн програми є непорушним у випадку, коли бажані частини дизайну сильно залежать від небажаних деталей реалізації. Дизайнери, які поставлять собі за мету проєктування такого дизайну, який можна було б використати у інших програмах, можуть здивуватися, як зручно такий дизайн використовувати при створенні нової програми. Але якщо було спроєктовано дизайн, що сильно пов'язаний с деталями реалізації, то такі дизайнери будуть налякані кількістю роботи, необхідної для виокремлення потрібної частини дизайну з-поміж інших непотрібних частин. У багатьох випадках такі проєкти не використовуються повторно, оскільки витрати на виокремлення необхідної частини вищі, ніж витрати на проєктування нового дизайну.
Історія
Принцип інверсії залежностей був введений Робертом Мартіном і викладений ним у кількох публікаціях, таких як Object Oriented Design Quality Metrics: an analysis of dependencies, у статті The Dependency Inversion Principle, що була опублікована у 1996 році в журналі C++ Report, а також у книгах «Agile Software Development, Principles, Patterns, and Practices» та «Agile Principles, Patterns, and Practices in C#».
Походження назви
Традиційні методи проєктування програмного забезпечення схиляють до створення програмних структур, у яких модулі вищого рівня залежать від модулів нижчого та у яких абстракції залежать від деталей реалізації. Ці методи, крім всього іншого, мають на меті визначення ієрархії підпрограм, які описують, як модулі вищого рівня здійснюють виклики до модулів нижчого рівня. Тому структура залежностей добре спроєктованої об'єктно-орієнтованої програми «інвертована» по відношенню до структури залежностей, яка є результатом традиційних процедурних методів проєктування.
Див. також
Примітки
- Martin, Robert C. (May 1996). (PDF). C++ Report. Архів оригіналу (PDF) за 14 липня 2011. (англ.)
- (PDF). Архів оригіналу (PDF) за 13 травня 2019. Процитовано 16 серпня 2014.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Princip inve rsiyi zale zhnostej angl Dependency Inversion Principle DIP odin z p yati SOLID principiv ob yektno oriyentovanogo proyektuvannya program sut yakogo polyagaye u rozrivi zv yaznosti mizh programnimi modulyami vishogo ta nizhchogo rivniv za dopomogoyu spilnih abstrakcij Princip formulyuyetsya nastupnim chinom Moduli vishogo rivnya ne povinni zalezhati vid moduliv nizhchogo rivnya Obidva tipi moduliv povinni zalezhati vid abstrakcij Abstrakciyi ne povinni zalezhati vid detalej realizaciyi Detali realizaciyi povinni zalezhati vid abstrakcij Princip inversiyi zalezhnostej virishuye problemi nevdalogo proyektuvannya program Zalezhnist vid abstrakcijShob uniknuti inshoyi zalezhnosti krim zalezhnosti vid abstrakcij potribno Usi zminni chleni klasu povinni buti abo abstraktnimi abo interfejsami Klasi ne povinni uspadkovuvatis vid ne abstraktnih klasiv Metodi ne povinni zamishati metodi realizaciyi Usi moduli klasiv povinni priyednuvatis cherez moduli interfejsiv abstraktnih klasiv Usi ob yekti povinni stvoryuvatis cherez tvirni shabloni fabrichnij metod chi fabriku chi cherez biblioteki vprovadzhennya zalezhnostej Problemi nevdalogo proyektuvannya programRobert Martin u svoyij statti The Dependency Inversion Principle naviv kriteriyi za yakimi na jogo dumku mozhna viznachiti nevdalo sproyektovanu programu Programa abo yiyi chastina yaka vikonuye svoye priznachennya i v toj samij chas maye odnu abo dekilka nastupnih osoblivostej ye nevdalo sproyektovanoyu U programu abo yiyi chastinu skladno vnesti zmini oskilki bud yaka zmina vplivaye na zanadto veliku kilkist komponentiv sistemi zhorstkist Pri vnesenni zmin porushuyetsya robota komponentiv sistemi u nespodivanih miscyah krihkist Skladno vikoristati toj samij kod u inshij programi oskilki jogo nemozhlivo vityagti z danoyi programi neporushnist Programa sproyektovana zhorstko yaksho u neyi ne mozhna legko vnesti zmini Taka zhorstkist obumovlena tim faktom sho odna yedina zmina do tisno vzayemozv yazanogo kodu daye pochatok poslidovnosti zmin v zalezhnih modulyah Yaksho dizajneri abo rozrobniki ne zdatni viznachiti mezhi tiyeyi poslidovnosti zmin vpliv cih zmin nemozhlivo sprognozuvati A otzhe i naslidki cih zmin sprognozuvati nemozhlivo Kerivniki proyektiv yaki stikayutsya z podibnoyu neperedbachuvanistyu neohoche pogodzhuyutsya na vprovadzhennya zmin Tomu takij dizajn oficijno viznayetsya zhorstkim Krihkist oznachaye shilnist programi do viniknennya pomilok u bagatoh miscyah pislya vnesennya hocha b odniyeyi pravki Chasto buvaye sho problemi vinikayut u miscyah yaki ne mayut konceptualnogo vidnoshennya do miscya yakogo stosuvalas pravka Taka krihkist znizhuye doviru do organizaciyi sho zajmalasya proyektuvannyam ta rozrobkoyu programi Koristuvachi ta kerivniki proyektiv ne mozhut peredbachiti yakist yih produktu Prosti zmini vneseni do odniyeyi chastini programi prizvodyat do zboyiv u roboti zovsim ne pov yazanih z neyu inshih chastin programi Sprobi vipraviti ce prizvodyat do viniknennya she bilshih trudnoshiv i proces pidtrimki produktu pochinaye nagaduvati sobaku sho bigaye za vlasnim hvostom Dizajn programi ye neporushnim u vipadku koli bazhani chastini dizajnu silno zalezhat vid nebazhanih detalej realizaciyi Dizajneri yaki postavlyat sobi za metu proyektuvannya takogo dizajnu yakij mozhna bulo b vikoristati u inshih programah mozhut zdivuvatisya yak zruchno takij dizajn vikoristovuvati pri stvorenni novoyi programi Ale yaksho bulo sproyektovano dizajn sho silno pov yazanij s detalyami realizaciyi to taki dizajneri budut nalyakani kilkistyu roboti neobhidnoyi dlya viokremlennya potribnoyi chastini dizajnu z pomizh inshih nepotribnih chastin U bagatoh vipadkah taki proyekti ne vikoristovuyutsya povtorno oskilki vitrati na viokremlennya neobhidnoyi chastini vishi nizh vitrati na proyektuvannya novogo dizajnu IstoriyaPrincip inversiyi zalezhnostej buv vvedenij Robertom Martinom i vikladenij nim u kilkoh publikaciyah takih yak Object Oriented Design Quality Metrics an analysis of dependencies u statti The Dependency Inversion Principle sho bula opublikovana u 1996 roci v zhurnali C Report a takozh u knigah Agile Software Development Principles Patterns and Practices ta Agile Principles Patterns and Practices in C Pohodzhennya nazviTradicijni metodi proyektuvannya programnogo zabezpechennya shilyayut do stvorennya programnih struktur u yakih moduli vishogo rivnya zalezhat vid moduliv nizhchogo ta u yakih abstrakciyi zalezhat vid detalej realizaciyi Ci metodi krim vsogo inshogo mayut na meti viznachennya iyerarhiyi pidprogram yaki opisuyut yak moduli vishogo rivnya zdijsnyuyut vikliki do moduliv nizhchogo rivnya Tomu struktura zalezhnostej dobre sproyektovanoyi ob yektno oriyentovanoyi programi invertovana po vidnoshennyu do strukturi zalezhnostej yaka ye rezultatom tradicijnih procedurnih metodiv proyektuvannya Div takozhInversiya keruvannya Vprovadzhennya zalezhnostejPrimitkiMartin Robert C May 1996 PDF C Report Arhiv originalu PDF za 14 lipnya 2011 angl PDF Arhiv originalu PDF za 13 travnya 2019 Procitovano 16 serpnya 2014