确保ViewModel状态在验证后不会更改的做法

时间:2016-08-25 11:51:34

标签: validation design-patterns mvvm architecture viewmodel

如果Controller首先验证ViewModel属性,然后使用ViewModel属性,那么ViewModel状态在验证和使用之间可能会变为无效的可能性很小,从而导致特殊的控制流程。

是否有任何通用的做法或模式可确保ViewModel状态不会发生变化和/或验证后可以安全使用属性?

1 个答案:

答案 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(即一种数据结构,在修改时保留其旧版本,通常通过结构共享)。这种不可变集合的库存在不同的语言。

  1. Javascript:Immutable.js
  2. .Net:System.Collections.Immutable
  3. Java:http://www.javaslang.io/
  4. Python:pyrsistent
  5. 您应用于此类集合的任何函数都将返回一个新集合,并保持原始集合不受影响。这样,可以安全地共享集合,而无需锁定。