Clean Architecture — общий подход к реализации архитектуры приложения. Соблюдение принципов чистой архитектуры позволяет писать легко изменяемый и легко тестируемый код. Такой подход к разработке позволяет избежать зависимости от сторонних библиотек и конкретных реализаций. Это упрощает процесс внесения изменений на всех этапах разработки. Подробнее можно прочесть здесь.
в Java слои разделены по пакетам, в Kotlin — по модулям.
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>
}
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, которые провайдят необходимые бизнес-слою реализации.
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 для каждого экрана.