如果Controller
首先验证ViewModel
属性,然后使用ViewModel
属性,那么ViewModel
状态在验证和使用之间可能会变为无效的可能性很小,从而导致特殊的控制流程。
是否有任何通用的做法或模式可确保ViewModel
状态不会发生变化和/或验证后可以安全使用属性?
答案 0 :(得分:2)
通过保持状态不可变,您可以确保验证和使用之间没有变化。
例如:
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(即一种数据结构,在修改时保留其旧版本,通常通过结构共享)。这种不可变集合的库存在不同的语言。
您应用于此类集合的任何函数都将返回一个新集合,并保持原始集合不受影响。这样,可以安全地共享集合,而无需锁定。