根据当前的实践(至少使用 WPF 和 Silverlight),我们看到通过视图模型中的命令绑定绑定的视图,或者我们至少看到在视图模型中处理的视图事件。这似乎违反了SRP,因为视图模型不仅对视图状态建模,而且对视图(用户)做出响应。其他人询问如何在不违反 SRP 的情况下构建视图模型,或者询问他们的实现是否这样做(最后一个是 MVC 中的控制器,但大致类似)。
那么当前的做法是否违反了 SRP?还是“视图模型”真的是不违反 SRP 的东西的集合?稍微解释一下,似乎我们需要知道什么是单一职责,或者如果概念中有多个职责,是否将个人职责拆分出来,符合 SRP。我不知道。
维基百科对视图模型的定义说
[T]ViewModel 是“视图的模型”,这意味着它是视图的抽象,也用于视图和模型之间的数据绑定
这对于 SRP 来说似乎已经足够好了,但后来的条目说(我强调了)
[ViewModel] 充当数据绑定器/转换器,将模型信息更改为视图信息并将命令从视图传递到模型
在一篇关于视图模型角色的Prism 博客文章中,作者说(再次强调)
它归结为视图模型是以下内容的组合:
- 视图的抽象
- 命令
- 价值转换器
- 查看状态
我确定我错过了许多定义,但它们似乎属于以下类别:
- 建模视图状态的单一“模糊”责任(所以我们所说的状态是什么 意思)
- 多重职责(视图状态、用户交互(即命令))
- 单一特定职责(抽象、状态、交互、转换)的组合,因此具有单一职责:“管理所有这些东西”。
如果你很好奇,我“关心”这个,因为(2)感觉不错,但似乎与流行的实现背道而驰。