Как Dependency Inversion соотносится с Dependency Injection

«Как Dependency Inversion соотносится с Dependency Injection» — вопрос из категории DI, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Dependency Inversion Principle (DIP) — это принцип SOLID, который гласит, что модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракций. Dependency Injection (DI) — это паттерн, реализующий DIP, позволяя передавать зависимости извне (через конструктор, методы или поля), а не создавать их внутри класса.

Пример с DIP + DI:

interface Repository {  
    fun getData(): String  
}  

class NetworkRepository : Repository {  
    override fun getData() = "Data from network"  
}  

class ViewModel(private val repo: Repository) { // DI через конструктор  
    fun loadData() = repo.getData()  
}  

DI обеспечивает гибкость, тестируемость и соблюдение DIP, так как ViewModel зависит от абстракции (Repository), а не от конкретной реализации.