Інверсія керування (англ. Inversion of Control, IoC) — це принцип побудови програми, при якому її частини отримують потік керування (викликаються) із загальної спільновикористовуваної бібліотеки. Це ніби звичайне процедурне програмування вивернуте навиворіт (inversed). Також це називають «голлівудським принципом»: «Не дзвоніть нам, ми подзвонимо вам».
Однією з реалізацій IoC є впровадження залежностей (англ. Dependency Injection), що використовується в багатьох фреймворках, вони називаються IoC контейнери. Використовуються в таких об'єктно-орієнтованих мовах програмування, як Smalltalk, , Java, PHP або мови платформи .NET.
Огляд
Наприклад, у разі традиційного програмування, головна функція програми може викликати функцію з бібліотеки, щоб відобразити список доступних команд, і запросити користувача вибрати одну з них. Бібліотека поверне вибрану опцію як результат виклику функції. Цей стиль використовувався в текстових інтерфейсах. Наприклад, поштовий клієнт може показати екран з командами для завантаження нових листів, відповіді на поточний лист, розпочати новий лист і т. д., а виконання програми буде заблоковане допоки користувач не натисне клавішу, щоб обрати команду.
Натомість, у разі інверсії керування, програма пишеться з використанням програмного каркаса, який знає загальні поведінкові і графічні елементи, такі як віконний інтерфейс, меню, керування мишкою тощо. Користувацький код «заповнює пробіли» в каркасі, такі як надавання таблиці елементів меню і реєстрація підпрограм для кожного елемента, але відслідковування дій користувача і виклик пов'язаної підпрограми є завданням каркаса. У прикладі поштового клієнта, каркас може слідкувати за клавіатурою і мишкою і викликати команду, обрану користувачем, також одночасно з цим моніторити мережевий інтерфейс, щоб помітити прибуття нового повідомлення і оновити екран коли з'являється мережева активність. Цей самий каркас можна використати як скелет для програми електронних таблиць або текстового редактора. З іншого боку, каркас нічого не знає про вебоглядачі, електронні таблиці, текстові редактори; втіленням їх функціональності займається користувацький код.
Інверсія керування несе важливу ідею, що повторно використовний код і завдання-залежний код розробляються незалежно, хоча й діють разом. Програмні каркаси, callback'и, планувальники, і впровадження залежностей є прикладами шаблонів, що слідують принципу інверсії керування, хоча термін найчастіше вживається в контексті ООП.
Принцип інверсії залежностей
Модулі верхніх рівнів не повинні залежати від модулів нижчих рівнів. Обидва типи модулів повинні залежати від абстракцій. Абстракції не повинні залежати від деталей. Деталі повинні залежати від абстракцій.
Клас X залежить від класу Y, якщо виконується одна з наступних умов:
- X містить (has-a) Y
- X є (is-a) Y
- X залежить від деякого класу Z, який залежить від Y (принцип транзитивності)
X залежить від Y не означає, що Y залежить від X. Якщо ж існують обидві залежності, то це називається циклічною залежністю: X не може бути використаний без Y, та навпаки. Існування великого числа циклічних залежностей в об'єктно-орієнтованій програмі може бути показником неоптимальної будови програми.
Розрив залежності
Якщо об'єкт x (класу X) викликає методи об'єкту y (класу Y), то X залежить від Y. Залежність може бути звернена створенням третього класу, а саме інтерфейсного класу I, який повинен містити всі методи, які x може викликати в об'єкта y. Крім того, Y повинен реалізовувати інтерфейс I. X та Y наразі обидва залежать від I, і клас X більш не залежить від класу Y; передбачається, що X не реалізує I.
Це виключення залежності класу X від Y через створення інтерфейсу I і називається Inversion of Control.
Слід сказати, що Y може залежати від інших класів. До внесення змін X залежав від Y, тоді X побічно залежав від усіх класів, від яких залежить Y. За допомогою застосування Inversion of Control усі побічні залежності були розірвані — не тільки залежність X від Y.
Застосування IoC контейнерів
C++
- PocoCapsule [ 24 квітня 2011 у Wayback Machine.]
Java
Програмісти, які використовують Java застосовують Inversion of Control в Inversion of Control контейнерах. Програмне забезпечення робить запит на об'єкт з контейнера, та контейнер створює об'єкт та його залежності. Сервер программ був одним з перших обчислювальних середовищ, які ефективно використовували цей підхід. Сучасні приклади IoC-контейнерів: , , Spring Framework (Spring — повноцінна корпоративна платформа, а не тільки IoC-контейнер), , , и DPML Metro.
.NET
- Unity Application Block 2.0 [ 24 червня 2011 у Wayback Machine.]
- Spring.NET [ 2 квітня 2006 у Wayback Machine.]
- CastleProject [ 25 червня 2014 у Wayback Machine.]
- Seasar [ 7 серпня 2011 у Wayback Machine.]
- Winter.NET [ 3 квітня 2011 у Wayback Machine.]
- Ninject [ 23 червня 2011 у Wayback Machine.]
PHP4
- drip [ 21 серпня 2011 у Wayback Machine.]
PHP5
- Garden [ 30 жовтня 2011 у Wayback Machine.]
- Symfony Dependency Injection [ 6 липня 2011 у Wayback Machine.]
Python
- zope.interface [ 12 червня 2011 у Wayback Machine.] і zope.component [ 11 вересня 2011 у Wayback Machine.]
RUBY
ActionScript
- Mate [ 15 квітня 2022 у Wayback Machine.]
- MIoC [ 19 лютого 2011 у Wayback Machine.]
- Swiz [ 17 січня 2022 у Wayback Machine.]
- Dawn [ 9 жовтня 2010 у Wayback Machine.]
Див. також
Примітки
- Dependency Injection [ 30 травня 2020 у Wayback Machine.].
Посилання
- Максим Базь. SOLID'не проєктування: принцип інверсії залежностей[недоступне посилання з червня 2019](рос.)
Це незавершена стаття про програмне забезпечення. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Inversiya keruvannya angl Inversion of Control IoC ce princip pobudovi programi pri yakomu yiyi chastini otrimuyut potik keruvannya viklikayutsya iz zagalnoyi spilnovikoristovuvanoyi biblioteki Ce nibi zvichajne procedurne programuvannya vivernute navivorit inversed Takozh ce nazivayut gollivudskim principom Ne dzvonit nam mi podzvonimo vam Odniyeyu z realizacij IoC ye vprovadzhennya zalezhnostej angl Dependency Injection sho vikoristovuyetsya v bagatoh frejmvorkah voni nazivayutsya IoC kontejneri Vikoristovuyutsya v takih ob yektno oriyentovanih movah programuvannya yak Smalltalk C Java PHP abo movi platformi NET OglyadNapriklad u razi tradicijnogo programuvannya golovna funkciya programi mozhe viklikati funkciyu z biblioteki shob vidobraziti spisok dostupnih komand i zaprositi koristuvacha vibrati odnu z nih Biblioteka poverne vibranu opciyu yak rezultat vikliku funkciyi Cej stil vikoristovuvavsya v tekstovih interfejsah Napriklad poshtovij kliyent mozhe pokazati ekran z komandami dlya zavantazhennya novih listiv vidpovidi na potochnij list rozpochati novij list i t d a vikonannya programi bude zablokovane dopoki koristuvach ne natisne klavishu shob obrati komandu Natomist u razi inversiyi keruvannya programa pishetsya z vikoristannyam programnogo karkasa yakij znaye zagalni povedinkovi i grafichni elementi taki yak vikonnij interfejs menyu keruvannya mishkoyu tosho Koristuvackij kod zapovnyuye probili v karkasi taki yak nadavannya tablici elementiv menyu i reyestraciya pidprogram dlya kozhnogo elementa ale vidslidkovuvannya dij koristuvacha i viklik pov yazanoyi pidprogrami ye zavdannyam karkasa U prikladi poshtovogo kliyenta karkas mozhe slidkuvati za klaviaturoyu i mishkoyu i viklikati komandu obranu koristuvachem takozh odnochasno z cim monitoriti merezhevij interfejs shob pomititi pributtya novogo povidomlennya i onoviti ekran koli z yavlyayetsya merezheva aktivnist Cej samij karkas mozhna vikoristati yak skelet dlya programi elektronnih tablic abo tekstovogo redaktora Z inshogo boku karkas nichogo ne znaye pro veboglyadachi elektronni tablici tekstovi redaktori vtilennyam yih funkcionalnosti zajmayetsya koristuvackij kod Inversiya keruvannya nese vazhlivu ideyu sho povtorno vikoristovnij kod i zavdannya zalezhnij kod rozroblyayutsya nezalezhno hocha j diyut razom Programni karkasi callback i planuvalniki i vprovadzhennya zalezhnostej ye prikladami shabloniv sho sliduyut principu inversiyi keruvannya hocha termin najchastishe vzhivayetsya v konteksti OOP Princip inversiyi zalezhnostejDokladnishe Princip inversiyi zalezhnostej Moduli verhnih rivniv ne povinni zalezhati vid moduliv nizhchih rivniv Obidva tipi moduliv povinni zalezhati vid abstrakcij Abstrakciyi ne povinni zalezhati vid detalej Detali povinni zalezhati vid abstrakcij Klas X zalezhit vid klasu Y yaksho vikonuyetsya odna z nastupnih umov X mistit has a Y X ye is a Y X zalezhit vid deyakogo klasu Z yakij zalezhit vid Y princip tranzitivnosti X zalezhit vid Y ne oznachaye sho Y zalezhit vid X Yaksho zh isnuyut obidvi zalezhnosti to ce nazivayetsya ciklichnoyu zalezhnistyu X ne mozhe buti vikoristanij bez Y ta navpaki Isnuvannya velikogo chisla ciklichnih zalezhnostej v ob yektno oriyentovanij programi mozhe buti pokaznikom neoptimalnoyi budovi programi Rozriv zalezhnosti Yaksho ob yekt x klasu X viklikaye metodi ob yektu y klasu Y to X zalezhit vid Y Zalezhnist mozhe buti zvernena stvorennyam tretogo klasu a same interfejsnogo klasu I yakij povinen mistiti vsi metodi yaki x mozhe viklikati v ob yekta y Krim togo Y povinen realizovuvati interfejs I X ta Y narazi obidva zalezhat vid I i klas X bilsh ne zalezhit vid klasu Y peredbachayetsya sho X ne realizuye I Ce viklyuchennya zalezhnosti klasu X vid Y cherez stvorennya interfejsu I i nazivayetsya Inversion of Control Slid skazati sho Y mozhe zalezhati vid inshih klasiv Do vnesennya zmin X zalezhav vid Y todi X pobichno zalezhav vid usih klasiv vid yakih zalezhit Y Za dopomogoyu zastosuvannya Inversion of Control usi pobichni zalezhnosti buli rozirvani ne tilki zalezhnist X vid Y Zastosuvannya IoC kontejnerivC PocoCapsule 24 kvitnya 2011 u Wayback Machine Java Programisti yaki vikoristovuyut Java zastosovuyut Inversion of Control v Inversion of Control kontejnerah Programne zabezpechennya robit zapit na ob yekt z kontejnera ta kontejner stvoryuye ob yekt ta jogo zalezhnosti Server programm buv odnim z pershih obchislyuvalnih seredovish yaki efektivno vikoristovuvali cej pidhid Suchasni prikladi IoC kontejneriv Spring Framework Spring povnocinna korporativna platforma a ne tilki IoC kontejner i DPML Metro NET Unity Application Block 2 0 24 chervnya 2011 u Wayback Machine Spring NET 2 kvitnya 2006 u Wayback Machine CastleProject 25 chervnya 2014 u Wayback Machine Seasar 7 serpnya 2011 u Wayback Machine Winter NET 3 kvitnya 2011 u Wayback Machine Ninject 23 chervnya 2011 u Wayback Machine PHP4 drip 21 serpnya 2011 u Wayback Machine PHP5 Garden 30 zhovtnya 2011 u Wayback Machine Symfony Dependency Injection 6 lipnya 2011 u Wayback Machine Python zope interface 12 chervnya 2011 u Wayback Machine i zope component 11 veresnya 2011 u Wayback Machine RUBY ActionScript Mate 15 kvitnya 2022 u Wayback Machine MIoC 19 lyutogo 2011 u Wayback Machine Swiz 17 sichnya 2022 u Wayback Machine Dawn 9 zhovtnya 2010 u Wayback Machine Div takozhPrincip inversiyi zalezhnostej Vprovadzhennya zalezhnostejPrimitkiDependency Injection 30 travnya 2020 u Wayback Machine PosilannyaMaksim Baz SOLID ne proyektuvannya princip inversiyi zalezhnostej nedostupne posilannya z chervnya 2019 ros Ce nezavershena stattya pro programne zabezpechennya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi