Для чего разбивать модуль фичи на API-модули и Impl-модули

«Для чего разбивать модуль фичи на API-модули и Impl-модули» — вопрос из категории Архитектура, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Разделение на API и Impl модули помогает изолировать публичный интерфейс фичи от её реализации. Это полезно для:

  1. Сокрытия реализации - клиенты зависят только от API, не зная деталей
  2. Упрощения тестирования - можно подменять реализацию моками
  3. Гибкости - реализацию можно менять без изменения API
  4. Избегания циклических зависимостей

Пример структуры:

:feature-auth-api   // содержит интерфейсы, модели
:feature-auth-impl  // содержит реализацию

В API модуле объявляются интерфейсы:

interface AuthRepository {
    suspend fun login(credentials: Credentials): User
}

В Impl модуле реализация:

class AuthRepositoryImpl @Inject constructor(
    private val service: AuthService
) : AuthRepository {
    override suspend fun login(credentials: Credentials) = 
        service.login(credentials)
}