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

«Объясни принцип инверсии управления (IoC) на примере сервиса такси.» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Инверсия управления (IoC) — это принцип проектирования, при котором управление созданием и связыванием объектов делегируется внешнему контейнеру (фреймворку), а не реализуется внутри самого класса. Это уменьшает связанность кода.

Пример с такси: Без IoC клиент сам управляет процессом: находит службу, вызывает такси, контролирует выполнение. С IoC клиент лишь декларирует потребность ("мне нужно такси"), а внешний сервис (контейнер) управляет всем процессом: подбирает машину, назначает водителя, строит маршрут.

Пример кода на Java (Spring):

// Без IoC: клиент сам создает и управляет зависимостью.
TaxiService taxi = new YandexTaxiService();
taxi.orderRide("Airport");

// С IoC (через Dependency Injection): контейнер внедряет зависимость.
@Component
public class ClientService {
    @Autowired // Spring IoC контейнер предоставит реализацию.
    private TaxiService taxiService;

    public void goToAirport() {
        taxiService.orderRide("Airport");
    }
}

Ключевые моменты:

  • TaxiService — это абстракция (интерфейс).
  • Конкретная реализация (YandexTaxiService, UberService) определяется и управляется контейнером IoC (например, Spring ApplicationContext).
  • Клиентский код зависит от абстракции, а не от конкретного класса, что упрощает тестирование и модификацию.