
Эти три понятия часто путают - IOC, DIP и DI. Я нашел множество статей на эту тему, пытающихся описать разницу между ними, и большинство из них были немного противоречивыми, поэтому я решил провести исследование, чтобы формализовать и структурировать эти знания. Эти вопросы часто используются на собеседованиях, поэтому знание различий очень важно.
Принцип инверсии управления (Inversion of Control Principle)
Инверсия управления (IOC) - это принцип проектирования, который рекомендует делегировать любые дополнительные обязанности класса другим объектам (т.е. передавать управление другим объектам) для достижения меньшей связанности.
Контроль над потоком выполнения (например, через callbacks) и контроль над созданием и связыванием объектов - это основные обязанности, которые вы можете захотеть делегировать из класса.
Как видите, IOC - это очень широкий термин. Существует множество способов реализации инверсии управления.
Паттерн внедрения зависимостей (Dependency Injection Pattern)
Внедрение зависимостей (DI) - это паттерн проектирования, который может помочь с IOC. Он позволяет создавать зависимые объекты вне класса и предоставлять эти объекты классу.
Допустим, у нас есть клиент, который зависит от сервиса. Мы добавляем еще один объект, называемый инжектор (injector), который внедряет сервис в клиент. Вот как работает DI.
Инжектор может внедрять зависимости через конструктор клиента, методы клиента и свойства клиента. Это три типа внедрения.
Принцип инверсии зависимостей (Dependency Inversion Principle)
Принцип инверсии зависимостей (DIP) - это принцип проектирования для достижения меньшей связанности путем следования двум правилам в вашем коде.
- Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракций.
- Детали реализации должны зависеть от абстракций. Абстракции не должны зависеть от деталей.
Кстати, DIP - это D из принципов SOLID.
По сути, DIP - это нечто, что выделяется из первых двух. Это просто способ достичь меньшей связанности сам по себе.
Заключение
- Принцип (Principle) - это что-то базовое в теории
- Паттерн (Pattern) - это что-то более практичное в инженерных терминах
- IOC и DIP - это принципы
- DI - это паттерн, который может помочь с IOC