Это принцип программирования, который передает управление выполнением программы из рук разработчика в руки фреймворка или контейнера. IoC позволяет создавать более гибкие, расширяемые и тестируемые приложения за счет отделения бизнес-логики от деталей инфраструктуры.
🚩Идеи инверсии управления
🟠Отделение логики приложения от деталей реализации
В традиционном подходе компоненты создают и управляют своими зависимостями напрямую. С IoC компоненты делегируют эту ответственность внешней системе.
🟠Улучшение модульности и повторного использования
Компоненты становятся более независимыми и легко заменяемыми, что способствует повторному использованию и тестируемости.
🚩Реализация
IoC может быть реализована несколькими способами, в том числе через Dependency Injection (внедрение зависимостей) и Service Locator (локатор служб).
🟠Dependency Injection (DI)
Это наиболее распространенный способ реализации IoC, где зависимости объекта передаются ему извне, а не создаются внутри. Пример на Java с использованием Spring. В этом примере Spring фреймворк автоматически внедряет зависимость
Repository в Service через конструктор.import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Service {
private final Repository repository;
@Autowired
public Service(Repository repository) {
this.repository = repository;
}
public void performAction() {
repository.doSomething();
}
}
🟠Service Locator
Это шаблон проектирования, который предоставляет центральное место для получения зависимостей. Компоненты запрашивают зависимости у локатора служб, вместо того чтобы создавать их напрямую. Пример на Java:
public class ServiceLocator {
private static final Map<Class<?>, Object> services = new HashMap<>();
public static <T> void registerService(Class<T> serviceClass, T service) {
services.put(serviceClass, service);
}
public static <T> T getService(Class<T> serviceClass) {
return serviceClass.cast(services.get(serviceClass));
}
}
// Использование Service Locator
ServiceLocator.registerService(Repository.class, new RepositoryImpl());
Repository repository = ServiceLocator.getService(Repository.class);
repository.doSomething();🚩Плюсы
➕Улучшение тестируемости
IoC позволяет легко заменять реальные зависимости на моки или стабы в тестах.
➕Уменьшение связности кода
Компоненты становятся менее зависимыми друг от друга, что упрощает их замену и модификацию.
➕Повышение гибкости и расширяемости
Легко добавлять новые зависимости или изменять существующие без изменения кода, использующего эти зависимости.
➕Явное управление зависимостями
Зависимости становятся явными, что улучшает понимание и документирование системы.
Ставь 👍 и забирай 📚 Базу знаний