Перейти к содержимому

IOC, DI, DIP

Эти три понятия часто путают - IOC, DIP и DI. Я нашел множество статей на эту тему, пытающихся описать разницу между ними, и большинство из них были немного противоречивыми, поэтому я решил провести исследование, чтобы формализовать и структурировать эти знания. Эти вопросы часто используются на собеседованиях, поэтому знание различий очень важно.

Принцип инверсии управления (Inversion of Control Principle)

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

Контроль над потоком выполнения (например, через callbacks) и контроль над созданием и связыванием объектов - это основные обязанности, которые вы можете захотеть делегировать из класса.

Как видите, IOC - это очень широкий термин. Существует множество способов реализации инверсии управления.

Паттерн внедрения зависимостей (Dependency Injection Pattern)

Внедрение зависимостей (DI) - это паттерн проектирования, который может помочь с IOC. Он позволяет создавать зависимые объекты вне класса и предоставлять эти объекты классу.

Допустим, у нас есть клиент, который зависит от сервиса. Мы добавляем еще один объект, называемый инжектор (injector), который внедряет сервис в клиент. Вот как работает DI.

Инжектор может внедрять зависимости через конструктор клиента, методы клиента и свойства клиента. Это три типа внедрения.

Принцип инверсии зависимостей (Dependency Inversion Principle)

Принцип инверсии зависимостей (DIP) - это принцип проектирования для достижения меньшей связанности путем следования двум правилам в вашем коде.

  1. Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.
  2. Детали реализации должны зависеть от абстракций. Абстракции не должны зависеть от деталей.

Кстати, DIP - это D из принципов SOLID.

По сути, DIP - это нечто, что выделяется из первых двух. Это просто способ достичь меньшей связанности сам по себе.

Заключение

  • Принцип (Principle) - это что-то базовое в теории
  • Паттерн (Pattern) - это что-то более практичное в инженерных терминах
  • IOC и DIP - это принципы
  • DI - это паттерн, который может помочь с IOC