Что такое принцип инверсии зависимостей
Что проверяют
Понимаете ли вы, что DIP это про направление зависимостей между слоями, а не просто «везде интерфейсы». Следом почти всегда просят отличить инверсию зависимостей от внедрения зависимостей и от IoC-контейнера Spring.
Как отвечать
Дайте формулировку Роберта Мартина из двух частей: модули верхнего уровня не зависят от модулей нижнего, оба зависят от абстракций; абстракции не зависят от деталей, детали зависят от абстракций.
Затем объясните слово «инверсия». Без принципа сервис заказов импортирует JdbcOrderRepository, и стрелка зависимости идёт от бизнес-логики к базе. С принципом сервис объявляет нужный ему интерфейс OrderRepository, а реализация на JDBC или JPA его выполняет. Стрелка развернулась: теперь инфраструктура зависит от домена. Деталь, которую часто упускают: интерфейс принадлежит слою потребителя и описан в его терминах, а не повторяет методы конкретной библиотеки.
Три понятия стоит развести:
- DIP: принцип проектирования, про то, кто от кого зависит;
- DI (внедрение зависимостей): техника, при которой объект получает зависимости снаружи, лучше всего через конструктор;
- IoC-контейнер: инструмент, который собирает граф объектов, как
ApplicationContextв Spring.
Следовать DIP можно без Spring, передавая реализации руками в main, и можно нарушать DIP со Spring, если сервис зависит от конкретного класса.
Практическая польза: в юнит-тесте сервис получает заглушку репозитория через Mockito, а смена хранилища не трогает бизнес-логику. На этом же стоит гексагональная архитектура с портами и адаптерами.
Где спотыкаются
Путают DIP с DI и отвечают «это когда @Autowired». Аннотация говорит только о способе получить объект, про направление зависимостей она ничего не сообщает.
Заводят интерфейс на каждый класс с единственной реализацией «по принципу». Абстракция нужна на границе, где реально меняется реализация или нужна подмена в тестах, в остальных местах это лишний шум.
Кладут интерфейс рядом с реализацией в инфраструктурный пакет. Тогда домен по-прежнему зависит от инфраструктуры, и инверсии не произошло.