Я недавно начал с Kotlin для разработки под Android. Он является объектно-ориентированным, но также поддерживает функциональные конструкции, такие как лямды, монады и т. Д.
Я думаю об использовании преимуществ обоих миров. Я хотел бы спроектировать слои моего приложения следующим образом:
------ ООП ----------- || ----------------- Функциональный -------------------------- ---------------------------
Вид -> ViewModel -> Варианты использования -> Хранилища -> Уровень данных / Источники данных -> Сеть
Некоторые рекомендации, которым я собираюсь следовать:
Состояние моего приложения будет сохранено в слое viewmodel и отображено в слое view.
Функциональные слои будут без состояния, содержащие только чистые функции. Он переводит предоставленный ввод в требуемый вывод. Им не нужно беспокоиться о среде, в которой они работают, а также о том, что они должны запускать контекст меньше.
Ни один компонент Android не должен входить в функциональный слой. Он предназначен только для бизнес-логики
Слой Viewmodel содержит логику приложения и логику представления. Состояние отображается как Livedata в этом слое
Представления подписываются на liveata и обновляют представление при получении уведомления.
Варианты использования - это единицы бизнес-логики
Viewmodel передаст копию объекта неизменного состояния в слой usecase.
Связь между viewmodel и usecases будет выгружена в фоновый поток и обратная связь в потоке пользовательского интерфейса, так что мне не нужно беспокоиться о фоновых потоках, затрагивающих мои Views.
UsecaseExecutor следует использовать для выполнения любого варианта использования, поскольку он выполняет разгрузку с использованием сопрограмм
Все чистые функции должны быть проверены модулем
Хранилища абстрагируют источники данных
Сетевой уровень свяжется с остальными службами, а уровень данных получит ответ JSON / XML, проанализирует и предоставит обратно либо соответствующие модели, либо ошибку.
Все функции, которые могут выдавать ошибки, должны иметь тип возвращаемого значения: Монета
Отказ должен быть закрытым классом
Я хотел бы знать недостатки этого проекта или кое-что, о чем я не позаботился, и некоторые лучшие подходы, которым нужно следовать.