【发布时间】:2019-11-02 10:57:10
【问题描述】:
我最近开始使用 Kotlin 进行 Android 开发。它是面向对象的,但也支持函数式结构,如 lamdas、monads 等。
我正在考虑利用这两个世界的好处。我想如下设计我的应用程序的层,
------ 面向对象 ----------- || ----------------- 功能性 ------------------------- ----------------------------------------
视图 -> 视图模型 -> 用例 -> 存储库 -> 数据层/数据源 -> 网络
我正在考虑遵循的一些准则:
我的应用程序的状态将存储在视图模型层并显示在视图层中。
功能层将是无状态的,仅包含纯函数。它将提供的输入转换为所需的输出。他们不必担心它运行的环境,也应该少运行上下文。
任何 Android 组件都不应进入功能层。它仅用于业务逻辑
Viewmodel 层包含应用程序逻辑和表示逻辑。状态在这一层被暴露为 Livedata
视图订阅实时数据并在收到通知时更新视图。
用例是业务逻辑单元
Viewmodel 会将不可变状态对象副本传递给用例层。
从视图模型到用例的通信将被卸载到后台线程并在 UI 线程中进行反向通信,这样我就不必担心后台线程会接触我的视图。
UsecaseExecutor 应该用于执行任何用例,因为它负责使用协程进行卸载
所有纯函数都应该进行单元测试
存储库抽象数据源
网络层将联系其余服务,数据层接收响应 JSON/XML ,解析并返回相应的模型或错误。
所有可以抛出错误的函数的返回类型都应该是 Either monad
失败应该是密封类
我想知道这个设计中的缺陷或我没有注意的地方以及一些可以遵循的最佳方法。
【问题讨论】:
-
别忘了匕首
-
感谢您的意见! :) 是的,我将在 DI 中使用匕首
标签: android oop functional-programming architecture