【发布时间】:2017-01-01 20:13:33
【问题描述】:
如果Controller 先验证ViewModel 属性,然后使用ViewModel 属性,则ViewModel 状态在验证和使用之间更改为无效的可能性很小,从而导致异常控制流。
是否有任何常见做法或模式来确保ViewModel 状态不会改变和/或属性可以在验证后安全使用?
【问题讨论】:
标签: validation design-patterns mvvm architecture viewmodel
如果Controller 先验证ViewModel 属性,然后使用ViewModel 属性,则ViewModel 状态在验证和使用之间更改为无效的可能性很小,从而导致异常控制流。
是否有任何常见做法或模式来确保ViewModel 状态不会改变和/或属性可以在验证后安全使用?
【问题讨论】:
标签: validation design-patterns mvvm architecture viewmodel
通过保持状态不可变,您可以确保验证和使用之间没有变化。
例如:
class MyViewModel {
property MyImmutableState state;
}
class MyController {
private MyViewModel viewModel;
private doSomething() {
MyImmutableState state = viewModel.state;
if (isValid(state))
// because state is immutable, this is thread-safe
doSomething(state);
}
}
使这项工作有效的关键是MyImmutableState 不仅应该是不可变的,而且应该是persistent data structure(即在修改时保留其旧版本的数据结构,通常通过结构共享)。此类不可变集合的库以不同的语言存在。
您对此类集合应用的任何函数都将返回一个新集合,而原始集合保持不变。这样,可以安全地共享集合,而无需锁定。
【讨论】:
ViewModel 它的集合仍然是可变的并且适合双向绑定到View? 2) 不可变对象尽可能多地用于属性值和内部集合? 3) 每个ViewModel 属性值都被捕获到函数范围变量中,以便以后用于验证和业务逻辑?