Что такое инверсия контроля? - PullRequest
1618 голосов
/ 06 августа 2008

Инверсия управления (или IoC) может привести к путанице при первом обнаружении.

  1. Что это?
  2. Какую проблему это решает?
  3. Когда целесообразно использовать, а когда нет?

Ответы [ 34 ]

25 голосов
/ 19 сентября 2008
  1. Инверсия управления - это шаблон, используемый для разделения компонентов и слоев в системе. Шаблон реализуется путем внедрения зависимостей в компонент при его создании. Эти зависимости обычно предоставляются в качестве интерфейсов для дальнейшей развязки и поддержки тестируемости. Контейнеры IoC / DI, такие как Castle Windsor, Unity - это инструменты (библиотеки), которые можно использовать для обеспечения IoC. Эти инструменты предоставляют расширенные функции помимо простого управления зависимостями, включая время жизни, AOP / перехват, политику и т. Д.

  2. а. Освобождает компонент от ответственности за управление его зависимостями.
    б. Предоставляет возможность менять реализации зависимостей в разных средах.
    с. Позволяет компоненту быть проверенным путем проверки зависимостей.
    д. Предоставляет механизм для совместного использования ресурсов в приложении.

  3. а. Критически важен при разработке на основе тестов. Без IoC тестирование может быть затруднено, поскольку тестируемые компоненты тесно связаны с остальной частью системы.
    б. Критически важен при разработке модульных систем. Модульная система - это система, компоненты которой могут быть заменены без перекомпиляции.
    с. Критически, если есть много сквозных проблем, которые необходимо решить, в частности, в корпоративном приложении.

20 голосов
/ 10 ноября 2014

Я запишу мое простое понимание этих двух терминов:

For quick understanding just read examples*

Внедрение зависимостей (DI):
Внедрение зависимости обычно означает передачу объекта, от которого зависит метод, в качестве параметра метода, вместо того, чтобы метод создавал зависимый объект .
На практике это означает, что метод не зависит напрямую от конкретной реализации; любая реализация, отвечающая требованиям, может быть передана в качестве параметра.

С этими объектами сообщают свои зависимости. И весна делает это доступным.
Это приводит к слабосвязанной разработке приложений.

Quick Example:EMPLOYEE OBJECT WHEN CREATED,
              IT WILL AUTOMATICALLY CREATE ADDRESS OBJECT
   (if address is defines as dependency by Employee object)

Контейнер инверсии управления (IoC):
Это общая характеристика рамок, IOC управляет объектами java
- от создания экземпляров до уничтожения через BeanFactory.
-Java-компоненты, которые создаются контейнером IoC, называются bean-компонентами, а контейнер IoC управляет областью действия bean-компонента, событиями жизненного цикла и любыми функциями AOP , для которых он был настроен и кодирован. *

QUICK EXAMPLE:Inversion of Control is about getting freedom, more flexibility, and less dependency. When you are using a desktop computer, you are slaved (or say, controlled). You have to sit before a screen and look at it. Using keyboard to type and using mouse to navigate. And a bad written software can slave you even more. If you replaced your desktop with a laptop, then you somewhat inverted control. You can easily take it and move around. So now you can control where you are with your computer, instead of computer controlling it.

Благодаря реализации Inversion of Control потребитель программного / объектного объекта получает больше элементов управления / опций над программным обеспечением / объектами вместо того, чтобы управлять им или иметь меньше параметров.

Инверсия управления в качестве руководства по проектированию служит следующим целям:

Существует разделение выполнения определенной задачи от реализации.
Каждый модуль может сосредоточиться на том, для чего он предназначен.
Модули не делают никаких предположений о том, что делают другие системы, но полагаются на свои контракты.
Замена модулей не оказывает побочного влияния на другие модули
Я буду держать это абстрактно, вы можете посетить следующие ссылки для более детального понимания темы.
Хорошее чтение с примером

Подробное объяснение

20 голосов
/ 11 января 2016

Отвечая только на первую часть. Что это?

Инверсия управления (IoC) означает создание экземпляров зависимостей первого и последнего экземпляра класса (необязательно внедрение их через конструктор), вместо того, чтобы сначала создавать экземпляр класса, а затем экземпляр класса, создавая экземпляры зависимостей. Таким образом, инверсия управления инвертирует поток управления программы. Вместо вызываемый управляющий поток управления (при создании зависимостей), вызывающий контролирует поток управления программой .

16 голосов
/ 26 сентября 2012

Позвольте сказать, что мы проводим какую-то встречу в каком-то отеле.

Много людей, много графинов с водой, много пластиковых стаканчиков.

Когда кто-то хочет выпить, она наполняет чашку, пьет и бросает чашку на пол.

Через час или около того у нас пол покрыт пластиковыми стаканчиками и водой.

Пусть инвертирует контроль.

Та же встреча в том же месте, но вместо пластиковых стаканчиков у нас есть официант с одной стеклянной чашкой (синглтон)

и она все время предлагает гостям выпить.

Когда кто-то хочет выпить, она достает из стакана официанта, пьет и возвращает его обратно официанту.

Оставляя в стороне вопрос о гигиенической, последняя форма контроля процесса питья гораздо более эффективна и экономична.

И это именно то, что делает Spring (другой контейнер IoC, например: Guice). Вместо того, чтобы позволить приложению создавать то, что ему нужно, используя новое ключевое слово (с пластиковой чашкой), контейнер Spring IoC все время предлагает приложению один и тот же экземпляр (singleton) нужного объекта (стакан воды).

Думайте о себе как об организаторе такой встречи. Вам нужен способ сообщить администрации отеля, что

участникам собрания понадобится стакан воды, но не кусок пирога.

Пример: -

public class MeetingMember {

    private GlassOfWater glassOfWater;

    ...

    public void setGlassOfWater(GlassOfWater glassOfWater){
        this.glassOfWater = glassOfWater;
    }
    //your glassOfWater object initialized and ready to use...
    //spring IoC  called setGlassOfWater method itself in order to
    //offer to meetingMember glassOfWater instance

}

Полезные ссылки: -

16 голосов
/ 27 января 2010

Например, задача № 1 - создать объект. Без концепции IOC задача №1 должна выполняться программистом. Но с концепцией IOC задача №1 будет выполняться контейнером.

Короче говоря, управление переворачивается из программатора в контейнер. Итак, это называется инверсией управления.

Я нашел один хороший пример здесь .

15 голосов
/ 06 августа 2008

Я согласен с NilObject , но я бы хотел добавить к этому:

если вы копируете весь метод и изменяете только небольшой фрагмент кода, вы можете рассмотреть его с инверсией управления

Если вы обнаружите, что копируете и вставляете код, вы почти всегда делаете что-то неправильно. Кодифицировано как принцип проектирования Один раз и только один раз .

15 голосов
/ 19 января 2011

Кажется, что самая запутанная вещь в "IoC" - аббревиатура и название, которое она обозначает, - это слишком гламурное имя - почти шумное имя.

Нужно ли нам действительно имя, чтобы описать разницу между процедурным и событийным программированием? Хорошо, если нам нужно, но нужно ли нам выбирать новое имя «больше, чем жизнь», которое сбивает с толку больше, чем решает?

11 голосов
/ 22 февраля 2013

Очень простое письменное объяснение можно найти здесь

http://binstock.blogspot.in/2008/01/excellent-explanation-of-dependency.html

Там написано -

"Любое нетривиальное приложение состоит из двух или более классов, которые сотрудничать друг с другом, чтобы выполнить некоторую бизнес-логику. Традиционно каждый объект отвечает за получение своего ссылки на объекты, с которыми он сотрудничает (его зависимости). При применении DI, объекты получают свои зависимости при создании время какой-то внешней сущностью, которая координирует каждый объект в система. Другими словами, зависимости вводятся в объекты. "

11 голосов
/ 19 сентября 2014

IoC - это инвертирование отношений между вашим кодом и сторонним кодом (библиотека / фреймворк):

  • При обычной разработке программного обеспечения вы пишете метод main () и вызываете "библиотечные" методы. Вы контролируете:)
  • В IoC "framework" управляет main () и вызывает ваши методы. Framework находится под контролем: (

DI (Dependency Injection) рассказывает о том, как управление передается в приложение. Традиционное настольное приложение имело поток управления от вашего приложения (метод main ()) к вызовам других библиотечных методов, но с потоком управления DI инвертировано, что фреймворк заботится о запуске вашего приложения, его инициализации и вызове ваших методов при необходимости.

В конце концов, вы всегда выигрываете:)

11 голосов
/ 15 декабря 2017

Смена контроля - это когда вы идете в продуктовый магазин, и ваша жена дает вам список продуктов для покупки.

В терминах программирования она передала функцию обратного вызова getProductList() выполняемой вами функции - doShopping().

Позволяет пользователю функции определять некоторые ее части, делая ее более гибкой.

...