Сервис получает через конструктор зависимость типа PostgresOrderRepository (конкретный класс), которую внедряет Spring. Что здесь верно?
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 соблюдены — зависимость ведь внедряется извне контейнером
Что спросят дальше
- Кому должен принадлежать интерфейс репозитория и почему?
- Как это связано с гексагональной архитектурой?
Разбор темы
- SOLID: пять принципов дизайна
SRP, OCP, LSP, ISP, DIP — что каждая буква значит на самом деле, как выглядит нарушение в Java-коде, чем DIP отличается от DI и IoC.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.