Инверсия управления

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая 212.92.138.191 (обсуждение) в 16:54, 19 января 2010. Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Инверсия управления (Inversion of Control, IoC) — важный принцип объектно-ориентированного программирования, используемый для уменьшения связности в компьютерных программах.

IoC также известен как Dependency Injection Principle. Приём Dependency Injection используется почти во всех framework'ах. Он применяется программистами, использующими такие объектно-ориентированные языки программирования, как Smalltalk, C++, Java или языки платформы .NET.

Техническое описание

Термины и определения

Класс X зависит от класса Y, если выполняется одно из следующих условий:

X зависит от Y не значит, что Y зависит от X. Если же существуют обе зависимости, то это называется циклической зависимостью: X не может быть использован без Y, и наоборот. Существование большого числа циклических зависимостей в объектно-ориентированной программе может быть показателем неоптимального программного построения.

Разрыв зависимости

Файл:Inversion of Control.svg
Разрыв зависимости с помощью Inversion of Control (UML диаграмма)

Если объект x (класса X) вызывает методы объекта y (класса Y), то X зависит от Y. Зависимость может быть обращена введением третьего класса, а именно интерфейсного класса I, который должен содержать все методы, которые x может вызвать у y. Кроме того, Y должен реализовать интерфейс I. X и Y сейчас оба зависят от I, и класс X более не зависит от класса Y; предполагается, что X не реализует Y.

Это исключение зависимости класса X от Y введением интерфейса I называется Inversion of Control (или Dependency Injection (DI)).

Следует отметить, что Y может зависеть от других классов. До внесения изменений X зависел от Y, таким образом X косвенно зависел от всех классов, от которых зависит Y. Применением Inversion of Сontrol все эти косвенные зависимости также были разорваны — не только зависимость X от Y. Новый интерфейс I ни от чего не зависит.

Применение Inversion of Control

C++

Java

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

.NET

PHP4

PHP5

Python

RUBY

ActionScript

Groovy на Grails

Groovy на Grails использует Spring Framework для запуска приложений.