Inversion of Control
Материал из Википедии — свободной энциклопедии
Inversion of Control (IoC) — важный принцип объектно ориентированного программирования, который используется для уменьшения связности в компьютерных программах.
IoC также известен как Dependency Inversion Principle. Приём Dependency Injection используется почти во всех framework'ах. Он применяется программистами использующими такие объектно-ориентированные языки программирования как Smalltalk, C++, Java или язык платформы .NET.
Содержание |
[править] Техническое описание
[править] Термины и определения
Класс 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 не реализует Y.
Это исключение зависимости сласса X от Y введением интерфейса I называется inversion of control (или dependency inversion).
Следует отметить что Y может зависеть от других классов. До внесения измениний, X зависел от Y таким образом X он косвенно зависел от всех классов от которых зависит Y. Применением Inversion of Сontrol, все эти косвенные зависимости были разорваны тоже, не только зависимость X от Y. Новый интерфейс I не от чего не зависит.
[править] Применнение Inversion of Control
[править] Java
Программисты использующие Java применяют Inversion of Control в Inversion of Control контейнерах. Программное обеспечение запрашивает объект из контейнера, и контейнер создаёт объект и его зависимости. Сервер приложений ATG Dynamo был одним из первых вычислительных сред эффективно использовавших этот подход. Современные примеры таких контейнеров: HiveMind, PicoContainer, Spring Framework (отметим, что Spring — полноценная корпоративная платформа, а не только IOC контейнер), Apache Excalibur, Seasar, и DPML Metro.
[править] .NET
[править] PHP4
[править] PHP5
[править] RUBY
[править] Groovy на Grails
Groovy на Grails использует Spring Framework для запуска приложений.