Вопрос с собеседования · Java

Сервис получает через конструктор зависимость типа PostgresOrderRepository (конкретный класс), которую внедряет Spring. Что здесь верно?

MiddleПринципы проектирования
Коротко

DI есть, DIP нарушен: зависимость приходит снаружи (техника внедрения), но сервис зависит от конкретного класса инфраструктуры, а не от абстракции. DIP — принцип: верхний уровень зависит от абстракции, которой сам владеет. DI — техника. IoC — общая идея, DI — её частный случай.

  • Исправление: интерфейс OrderRepository в доменном пакете
  • Spring отлично внедряет и конкретные классы — DIP он не обеспечивает
  • Тестировать проще через интерфейс

А ещё Интерфейс ради интерфейса с одной реализацией — не всегда нужен

Подробно

Разведи три понятия. DIP — принцип дизайна: верхний уровень зависит от абстракции, которой сам и владеет. DI — техника: зависимость приходит снаружи, а не создаётся через new. IoC — более широкая идея «управление вызывает нас», DI — её частный случай. Внедрение конкретного PostgresOrderRepository — это DI, но домен по-прежнему зависит от детали, значит инверсии нет.

Что хотят услышать

  • Различие DIP, DI, IoC.
  • Почему внедрение конкретного класса не инверсия.

Частые ошибки

  • Считать DI и DIP синонимами.
  • Думать, что достаточно завести любой интерфейс: если он говорит save/findById и возвращает JPA-сущности, деталь всё равно протекает в домен.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗DI нет, потому что нет интерфейса, а DIP при этом соблюдён
  • ✗DI и DIP — одно и то же понятие, поэтому здесь нарушены оба
  • ✓DI есть, но DIP нарушен: зависимость от конкретного класса
  • ✗И DI, и DIP соблюдены — зависимость ведь внедряется извне контейнером

Что спросят дальше

  • Кому должен принадлежать интерфейс репозитория и почему?
  • Как это связано с гексагональной архитектурой?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования