Русская Википедия:Инверсия управления
Инверсия управления (Шаблон:Lang-en, Шаблон:Lang-en2) — важный принцип объектно-ориентированного программирования, используемый для уменьшения зацепления (связанности) в компьютерных программах[1]. Также архитектурное решение интеграции, упрощающее расширение возможностей системы, при котором поток управления программы контролируется фреймворкомШаблон:Sfn.
В обычной программе программист сам решает, в какой последовательности делать вызовы процедур. Но если используется фреймворк, программист может разместить свой код в определенных точках выполнения (используя callback или другие механизмы), затем запустить «главную функцию» фреймворка, которая обеспечит все выполнение и вызовет код программиста тогда, когда это будет необходимо. Как следствие, происходит утеря контроля над выполнением кода — это и называется инверсией управления (фреймворк управляет кодом программиста, а не программист управляет фреймворком).
Инверсия управления бывает не только во фреймворках, но и в некоторых библиотеках (но обычно библиотеки не создают инверсии управления — они предоставляют набор функций, которые должен вызывать программист).
Описание
Одной из реализаций инверсии управления в применении к управлению зависимостями является внедрение зависимостей (Шаблон:Lang-en)Шаблон:Sfn[2]. Внедрение зависимости используется во многих фреймворках, которые называются IoC-контейнерами.
Если сравнить с более низкоуровневыми технологиями, IoC-контейнер — это компоновщик, который собирает не объектные файлы, а объекты ООП (экземпляры класса) во время исполнения программы. Очевидно, для реализации подобной идеи было необходимо создать не только сам компоновщик, но и фабрику, производящую объекты. Аналогом такого компоновщика (естественно, более функциональным) является компилятор, одной из функций которого является создание объектных файлов. В идее компоновки программы во время исполнения нет ничего нового. Предоставление программисту инструментов внедрения зависимостей дало значительно бо́льшую гибкость в разработке и удобство в тестировании кода[3].
Методы реализации
- Шаблон «Фабрика» (Шаблон:Lang-en)
- Локатор служб
- Внедрение зависимости (Шаблон:Lang-en)
- Через конструктор (Шаблон:Lang-en)
- Через метод класса (Шаблон:Lang-en)
- Через интерфейс внедрения (Шаблон:Lang-en)
- Контекстный поиск (Шаблон:Lang-en)
Критика
Все подходы, основанные на инверсии управления, страдают от следующих двух недостатков[4]:
- логика взаимодействия программы разбросана по отдельным обработчикам событий или классам;
- поток управления задан неявно и использует общее состояние (shared state) обработчиков событий.
Примечания
Литература
Ссылки