android - SharedViewModel 是否违反单一职责原则?
问题描述
我有一个活动和 4 个片段,我有 SharedViewModel 可以帮助我将数据从 Activity 传递到所有其他片段
Activity
|
SharedViewModel
|
----------------------------------------------------
| | | |
(Fragment A) (Fragment B) (Fragment C) (Fragment D)
现在在这里您可以看到 SharedViewModel 具有 Activity 以及所有 Fragment 的数据。因此,一个 SharedViewModel 包含 5 个不同类的变量和函数,如 LiveData 等变量、其他数据库相关函数或一些网络操作相关函数。
1) 只使用一个函数作为公共在所有类之间共享数据。
2) 其他功能是所有其他类的单独功能。
那么这是否违反单一责任原则?如果没有那怎么办?
解决方案
MVVM的单一职责原则可以参考存储库模式,您可以在存储库模式中使用ViewModel
.
所以想象一下,ViewModel
它只负责从 UI 到 Repository 的每个数据请求,并提供从 Repository 到 UI 返回的响应。
另一方面,Repository 只关心提供数据,而最终它是来自本地数据库还是来自 API 调用都无关紧要。
所以,这就是为 MVVM 派生单一职责的方式。
现在,对于您的架构,只要您为每个 UI (Activity/Fragment)提供数据更新,就可以100%好,因为每个组件通常共享和观察,这可以被认为是普遍的。SharedViewModel
LiveData
如果您放置一个数据持有者( LiveData
) / 变量,它可以被视为仅依赖于一个 UI,那么您应该ViewModel
为该 UI 使用个人,
所以关于第二点,“其他功能是所有其他类的单独功能。” 我建议您ViewModel
单独创建与您的 UI 相关的 sShareViewModel
并尽可能简单和小巧,这样您就不会将您的一个 UI 操作暴露给其他人。
推荐阅读
- swift - 将图像从设备上传到 Firebase
- php - 如何计算数组中具有非空对应值的数字键?
- python-3.x - UnicodeDecodeError:charmap'编解码器无法解码位置 756 中的字节 0x8f
- python - 无法通过 xpath 或 css 选择器找到文本框元素
- ssl - NGINX 403 禁止 - CentOS - Certbot
- javascript - 如何使用 RegExp 检查字符串?
- ios - 哪个是最新版本的 Xcode 在 App Store 上提交应用程序(Invalid Toolchain 错误)。?
- selenium - 如何使用 selenium webdriver 将焦点从 chrome 浏览器更改为 Internet Explorer?
- css - 为什么我不能在 CSS 变量中使用 rgba?
- php - 匹配包含“XYZ”且不以冒号开头的单词