Інверсія управління

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Інверсія управління (англ. Inversion of Control, IoC) — це принцип організації програми, згідно з яким керування потоком виконання программи здійснюється окремим модулем (як правило це частина програмного каркасу), що дозволяє зменшити зв'язність між іншими модулями программи. IoC входить у п'ятірку найважливіших принципів SOLID.

Найпопулярнішою реалізацією IoC є Dependency Injection Principle (принцип впровадження залежностей). Dependency Injection використовується в багатьох фреймворках, вони називаються IoC контейнери. Він застосовується програмістами, які використовують такі об'єктно-орієнтовані мови програмування, як Smalltalk, C++, Java, PHP або мови платформи .NET.

Технічний опис[ред.ред. код]

Терміни та визначення[ред.ред. код]

Модулі верхніх рівнів не повинні залежати від модулів нижчих рівнів. Обидва типа модулів повинні залежати від абстракцій. Абстракції не повинні залежати від деталей. Деталі повинні залежати від абстракцій.

Клас X залежить від класу 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.

Застосування Inversion of Control[ред.ред. код]

C++[ред.ред. код]

Java[ред.ред. код]

Програмісти, які використовують Java застосовують Inversion of Control в Inversion of Control контейнерах. Програмне забезпечення робить запит на об'єкт з контейнера, та контейнер створює об'єкт та його залежності. Сервер программ ATG Dynamo був одним з перших обчислювальних серед, які ефективно використовували цей підхід. Сучасні приклади IoC-контейнерів: HiveMind, PicoContainer, Spring Framework (Spring — повноцінна корпоративна платформа, а не тільки IoC-контейнер), Apache Excalibur, Seasar, и DPML Metro.

.NET[ред.ред. код]

PHP4[ред.ред. код]

PHP5[ред.ред. код]

Python[ред.ред. код]

RUBY[ред.ред. код]

ActionScript[ред.ред. код]

Посилання[ред.ред. код]