使用 ViewModel 的接口?

Posted

技术标签:

【中文标题】使用 ViewModel 的接口?【英文标题】:Using interfaces for ViewModels? 【发布时间】:2019-03-02 08:45:36 【问题描述】:

我目前正在根据官方文档和google提供的示例应用程序(向日葵和todo-app)将架构组件集成到我的应用程序中。我意识到这些都没有使用 ViewModels 的接口(向日葵应用程序甚至不使用存储库的接口)。

我的问题是:省略ViewModels的接口是否合理(包括优点和缺点)?

【问题讨论】:

【参考方案1】:

省略ViewModels的接口是否合理?

以下内容非常笼统,不仅适用于ViewModels

优势

更少的代码

缺点

将无法使用大多数知名设计模式; 将无法正确地对类进行单元测试(无模拟); 将无法正确使用依赖注入框架; 使用其他具体实现时的代码重构。

【讨论】:

我知道这不是问题的一部分,但是命名这样一个接口的最佳方式是什么?假设我有一个 TasksViewModel 类并想为它创建一个接口 @Doflaminhgo,按照开发人员使用的命名约定,您可以将它们命名为 1) TasksViewModel 用于接口,TasksViewModelImpl 用于具体实现或 2) ITasksViewModel 用于接口,TasksViewModel 用于具体实施。真的只是口味问题。【参考方案2】:

答案取决于您的 ViewModel 的复杂性。如果您永远不会创建多个接口的实现(包括模拟),则无需创建接口,因此您可以减少代码和整体维护负担。

也就是说要考虑的重要事项是:

即使没有界面,您能否对视图模型进行单元测试(答案应该是肯定的,否则 IMO 会遇到一些其他问题) 你还能使用依赖注入框架吗(答案是肯定的,至少对于 Prism 等一些 DI 框架) 您是否只打算创建一个 ViewModel 实现?

我认为,一个设计良好的 ViewModel 的标志应该是具有相对简单的实现,并且易于进行单元测试而不必诉诸模拟。

【讨论】:

以上是关于使用 ViewModel 的接口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在MVVM中使用相同的ViewModel拥有多个视图?

Android Jetpack架构组件(三)—ViewModel

Lifecycle+liveData+DataBinding三部曲

一个ViewModel,多个Activity

如何在ViewModel中访问View中的控件

MVVMLight 中一个 View 对应多的 ViewModel,和一个 View 对应 一个ViewModel