Ответ
Разделение на API и Impl модули помогает изолировать публичный интерфейс фичи от её реализации. Это полезно для:
- Сокрытия реализации - клиенты зависят только от API, не зная деталей
- Упрощения тестирования - можно подменять реализацию моками
- Гибкости - реализацию можно менять без изменения API
- Избегания циклических зависимостей
Пример структуры:
: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)
}