Clean Architecture — общий подход к реализации архитектуры приложения. Соблюдение принципов чистой архитектуры позволяет писать легко изменяемый и легко тестируемый код. Такой подход к разработке позволяет избежать зависимости от сторонних библиотек и конкретных реализаций. Это упрощает процесс внесения изменений на всех этапах разработки. Подробнее можно прочесть здесь.

Деление на слои по модулям:

1. App

com.livetyping.example
|----di
|----LiveTypingApplication.kt

В модуле App содержится пакет di, в котором модули, которые содержат информацию о том, как предоставлять объекты.

К нему подключаются все другие модули.

implementation project(":app-ui")
implementation project(":app-domain")
implementation project(":app-data")

2**. Data**

com.livetyping.example
|---- data
|     |---- device.repository
|     |     |---- AndroidBiometricRepository
|     |     |---- AndroidResourcesRepository
|     |---- net
|     |     |---- models
|     |     |     |---- SendLiveTypingRequest
|     |     |     |---- LoginRequest
|     |     |---- repository
|     |     |     |---- LiveTypingRepositoryImp
|     |     |     |---- LoginRepositoryImp
|     |     |---- retrofit
|     |     |     |---- HeadersInterceptor
|     |     |---- services
|     |     |     |---- LiveTypingService
|     |     |     |---- LoginService
|     |---- storage
|     |     |---- datebase
|     |     |     |-------... 
|     |     |---- preferences
|     |     |     |-------...

Слой Data содержит реализацию интерфейсов репозиториев из бизнес-слоя, пакеты, в которых реализована работа с источниками данных (rest, db, sockets, shared preferences и т.п.).

Зависимость:

implementation project(":app-domain")

3**. Domain**

com.livetyping.example
|---- domain
|     |---- interactor
|     |     |---- interfaces
|     |     |     |---- LiveTypingInteractor
|     |     |     |---- LoginLInteractor
|     |     |---- LiveTypingInteractorImp
|     |     |---- LoginInteractorImp
|     |---- model
|     |     |---- LiveTyping
|     |     |---- TokenDomain
|     |---- datacontracts
|     |     |---- device
|     |     |     |---- BiometricRepository
|     |     |     |---- ResourcesRepository
|     |     |---- net
|     |     |     |---- LiveTypingRepository
|     |     |     |---- LoginRepository
|     |     |---- storage
|     |     |     |---- AuthorizationStorageRepository

Слой Domain содержит data-классы (модели данных, структуры), классы логики — интеракторы/UseCase — и репозитории, с которыми работают интеракторы/UseCase. Следует обратить особое внимание внимание на то, что файлы в пакете repository — это интерфейсы. Реализовываются они в слое Data.

interface LoginRepository {
    suspend fun authByPassword(body: AuthByPasswordBody): TokenDomain
		suspend fun authBySmsCode(body: AuthOrVerifySmsCodeBody): TokenDomain
}

4**. Presentation**

com.livetyping.example
|---- ui
|     |---- services
|     |---- receivers
|     |---- screens
|     |     |---- livetyping
|     |     |---- login
|     |     |     |---- LoginFragment
|     |     |     |---- LoginViewModel
|     |---- common
|     |     |     |---- callbaks
|     |     |     |---- base
|     |     |     |---- utils
|     |     |     |---- views

Слой Presentation (UI) содержит пакеты base для реализации базовых классов паттерна MVVM/MVP, которые можно переиспользовать на нескольких экранах приложения. Пакет screens содержит отдельные пакеты для каждого экрана приложения, в которых реализованы подклассы базовых ViewModel/Presenter, View, Fragment, Activity.

Зависимости: