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

Деление на слои:

в Java слои разделены по пакетам, в Kotlin — по модулям.

1. Domain

com.livetyping.example
|---- domain
|     |---- interactor
|     |     |---- articles
|     |     |     |---- ArticlesInteractorImpl
|     |     |     |---- ArticlesInteractor
|     |     |---- categories
|     |     |---- channels
|     |     |---- login
|     |---- model
|     |     |---- Article
|     |     |---- Category
|     |     |---- Channel
|     |---- repository
|     |     |---- ArticlesRepository
|     |     |---- CategoriesRepository
|     |     |---- ChannelsRepository
|     |     |---- LoginRepository

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

interface ArticlesRepository {
     fun loadArticles(continueLoad: Boolean): Single<List<ModelArticle>>
     fun loadArticleById(id: String): Single<ModelArticle>

}

2. Data

com.livetyping.example
|---- data
|     |---- repository
|     |     |---- articles
|     |     |---- categories
|     |     |---- channels
|     |     |---- login
|     |     |     |---- DeviceLoginRequest
|     |     |     |---- LoginRepositoryImpl
|     |     |     |---- LoginService
|     |     |---- categories
|     |     |---- channels
|     |     |---- login
|     |     |     |---- LoginService
|     |     |     |---- DeviceLoginRest
|     |     |     |---- LoginRepositoryImpl
|     |---- DataModule

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

3. Presentation

com.livetyping.example
|---- ui
|     |---- adapter
|     |     |---- articles
|     |---- base
|     |     |---- BaseActivity
|     |     |---- BaseFragment
|     |     |---- BasePresenter
|     |     |---- BaseView
|     |     |---- FragmentSwitcherCompat
|     |---- screen
|     |     |---- articles
|     |     |---- categories
|     |     |---- channels
|     |     |---- login
|     |     |     |---- ChannelsComponent.kt
|     |     |     |---- ChannelsFragment
|     |     |     |---- ChannelsPresenter
|     |     |     |---- ChannelsView
|     |---- utils
|     |     |---- EndlessScrollListener
|     |     |---- ViewPagerAdapter
|     |     |---- ObservableWebView
|     |     |---- ObservableWebView

Слой Presentation (UI) содержит пакеты base для реализации базовых классов паттерна MVP, adapter, в котором реализуются классы адаптеров и вьюхолдеров, которые можно переиспользовать на нескольких экранах приложения. Пакет screen содержит отдельные пакеты для каждого экрана приложения, в которых реализованы подклассы базовых Presenter, View, Fragment, Activity и файл Component, в котором реализован отдельный компонент dagger для каждого экрана.