Как реализуется принцип Dependency Inversion в Clean Architecture

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

Ответ

Dependency Inversion Principle (DIP) в Clean Architecture означает, что модули верхнего уровня (доменные сущности, use cases) не должны зависеть от модулей нижнего уровня (репозитории, фреймворки). Вместо этого оба уровня зависят от абстракций (интерфейсов).

Пример:

// Domain layer (не зависит от деталей)
interface UserRepository {
    suspend fun getUser(id: String): User
}

class GetUserUseCase(private val repo: UserRepository) {
    suspend operator fun invoke(id: String) = repo.getUser(id)
}

// Data layer (реализует интерфейс)
class UserRepositoryImpl @Inject constructor(
    private val api: UserApi
) : UserRepository {
    override suspend fun getUser(id: String) = api.fetchUser(id)
}

Ключевые моменты:

  1. UseCase зависит только от интерфейса UserRepository
  2. Реализация UserRepositoryImpl может меняться без изменения домена
  3. Направление зависимостей идет к центру (домену)