Ответ
DIP (Dependency Inversion Principle) гласит, что модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Частные случаи:
- Внедрение зависимостей через конструктор
class UserRepository(private val api: ApiService) { ... }
Вместо создания ApiService внутри репозитория, зависимость инжектируется извне.
- Использование интерфейсов/абстрактных классов
interface Logger {
fun log(message: String)
}
class FileLogger : Logger { ... }
class DatabaseLogger : Logger { ... }
Модули зависят от интерфейса Logger, а не от конкретных реализаций.
-
Dagger/Hilt для DI
Библиотеки автоматизируют внедрение зависимостей, следуя DIP. -
Тестирование с Mock-объектами
Заменяем реальные зависимости mock-ами в тестах благодаря абстракциям.