Інверсія керування: відмінності між версіями

[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
→‎Огляд: виправлення автоматичної помилки "допоки користувач не натисне клавішЕ"
оформлення
Рядок 1:
'''Інверсія управління''' ({{lang-en|Inversion of Control}}, '''IoC''')  — це принцип побудови програми, при якому її частини отримують [[потік керування]] (викликаються) із загальної спільновикористовуваної бібліотеки. Це ніби звичайне [[процедурне програмування]] вивернуте навиворіт (inversed). Також це називають "«голлівудським принципом"»: "«Не дзвоніть нам, ми подзвонимо вам"».
 
IoC у вигляді [[принцип інверсії залежностей|принципу інверсії залежностей]] входить у п'ятірку принципів [[SOLID (об'єктно-орієнтоване програмування)|SOLID]].
Рядок 6:
 
== Огляд ==
Наприклад, у випадку традиційного програмування, головна функція програми може викликати функцію із бібліотеки, щоб відобразити список доступних команд, і запросити користувача вибрати одну з них.<ref name=FowlerDI>[http://martinfowler.com/articles/injection.html Dependency Injection].</ref> Бібліотека поверне вибрану опцію як результат виклику функції. Цей стиль використовувався у текстових інтерфейсах. Наприклад, [[поштовий клієнт]] може показати екран з командами для завантаження нових листів, відповіді на поточний лист, розпочати новий лист і &nbsp;т.&nbsp;д., а виконання програми буде заблоковане допоки користувач не натисне клавішу, щоб обрати команду.
 
Натомість, у випадку інверсії управління, програма пишеться із використанням [[Програмний каркас|програмного каркасу]], який знає загальні поведінкові і графічні елементи, такі як віконний інтерфейс, меню, керування мишкою і т.п.тощо Користувацький код «заповнює пробіли» у каркасі, такі як надавання таблиці елементів меню і реєстрація підпрограм для кожного елемента, але відслідковування дій користувача і виклик пов'язаної підпрограми є завданням каркасу. У прикладі поштового клієнта, каркас може слідкувати за клавіатурою і мишкою і викликати команду обрану користувачем, також одночасно з цим моніторити мережевий інтерфейс, щоб помітити прибуття нового повідомлення і оновити екран коли з'являється мережева активність. Цей самий каркас можна використати як скелет для програми електронних таблиць або текстового редактора. З іншого боку каркас нічого не знає про веб-оглядачі, електронні таблиці, текстові редактори; втіленням їх функціональності займається користувацький код.
 
Інверсія управління несе важливу ідею, що повторно використовний код і задача-залежний код розробляються незалежно, хоча й діють разом. [[Програмний каркас|програмніПрограмні каркаси]], [[callback (програмування)|callback'и]], [[Планувальник операційної системи|планувальники]], [[цикл подій|цикли подій]] і [[впровадження залежностей]] є прикладами шаблонів, що слідують принципу інверсії управління, хоча термін найчастіше вживається в контексті [[Об'єктно-орієнтоване програмування|ООП]].
 
== Принцип інверсії залежностей ==
Рядок 29:
Якщо об'єкт <tt>x</tt> (класу <tt>X</tt>) викликає методи об'єкту <tt>y</tt> (класу <tt>Y</tt>), то <tt>X</tt> залежить від <tt>Y</tt>. Залежність може бути звернена створенням третього класу, а саме інтерфейсного класу <tt>I</tt>, який повинен містити в собі усі методи, які <tt>x</tt> може викликати у об'єкта <tt>y</tt>. Крім того, <tt>Y</tt> повинен реалізовувати інтерфейс <tt>I</tt>. <tt>X</tt> та <tt>Y</tt> наразі обидва залежать від <tt>I</tt>, і клас <tt>X</tt> більш не залежить від класу <tt>Y</tt>; передбачається, що <tt>X</tt> не реалізує <tt>I</tt>.
 
Це виключення залежності класу <tt>X</tt> від <tt>Y</tt> шляхом створення інтерфейсу <tt>I</tt> і називається '''Inversion of Control'''.
 
Слід сказати, що <tt>Y</tt> може залежати від інших класів. До внесення змін <tt>X</tt> залежав від <tt>Y</tt>, тоді <tt>X</tt> побічно залежав від усіх класів, від яких залежить <tt>Y</tt>. За допомогою застосування '''Inversion of Control''' всі побічні залежності були розірвані &nbsp;— не тільки залежність <tt>X</tt> від <tt>Y</tt>.
 
== Застосування IoC контейнерів ==
Рядок 39:
 
=== Java ===
Програмісти, які використовують Java застосовують '''Inversion of Control''' в ''Inversion of Control контейнерах''. Програмне забезпечення робить запит на об'єкт з контейнера, та контейнер створює об'єкт та його залежності. Сервер программ [[ATG Dynamo]] був одним з перших обчислювальних середовищ, які ефективно використовували цей підхід. Сучасні приклади IoC-контейнерів: [[HiveMind]], [http://www.picocontainer.org PicoContainer], [[Spring Framework]] (Spring &nbsp;— повноцінна корпоративна платформа, а не тільки IoC-контейнер), [[Apache Excalibur]], [[Seasar]], и [http://www.dpml.net/metro/ DPML Metro].
 
=== .NET ===
Рядок 73:
 
== Див. також ==
* [[Принцип інверсії залежностей]]
* [[Принцип_інверсії_залежностей]]
* [[Впровадження залежностей]]
 
Рядок 80:
 
== Посилання ==
* Максим Базь. [http://z0rch.com/solid_dip SOLID'ноене проектированиепроєктування: принцип инверсииінверсії зависимостейзалежностей]{{ref-ru}}
 
{{Soft-stub}}