我最近开始使用Kotlin进行android开发。它是面向对象的,但也支持lamda,monad等功能构造。

我正在考虑利用两个世界的利益。我想按以下方式设计应用程序的层,

------ OOP ----------- || -----------------功能-------------------------------- ---------------------
视图-> ViewModel->用例->存储库->数据层/数据源->网络

我想遵循的一些准则:


我的应用程序状态将存储在viewmodel层中并显示在view层中。
功能层将是无状态的,仅包含纯功能,它将提供的输入转换为所需的输出。他们不必担心它正在运行的环境,也不必运行上下文。
任何Android组件都不应进入功能层。它仅用于业务逻辑
Viewmodel层包含应用程序逻辑和表示逻辑。状态在此层中作为Livedata公开
视图订阅实时数据并在收到通知时更新视图。
用例是业务逻辑单元
Viewmodel会将不可变状态对象副本传递到用例层。
从viewmodel到用例的通信将被卸载到后台线程,并在UI线程中进行反向通信,这样我就不必担心后台线程触碰到我的View。
UsecaseExecutor应该用于执行任何用例,因为它是使用协程进行卸载的一个用例
所有纯功能应进行单元测试
存储库抽象数据源
网络层将联系其余服务,数据层将接收响应JSON / XML,进行解析并提供相应的模型或错误。
所有可能引发错误的函数的返回类型应为Either monad
失败应该是密封的


我想知道此设计中的缺陷或我未曾注意的问题,以及一些最佳方法。

最佳答案

如果要在kotlin中使用功能部件,则需要添加箭头之类的功能库,因为kotlin核心并没有像您在第13点中提到的那样提供许多基本功能部件(如Either monad),光学部件和其他一些功能。
除此之外,我认为设计还不错

10-05 18:15
查看更多