【问题标题】:Practice to ensure ViewModel state doesn't change after validation练习确保 ViewModel 状态在验证后不会改变
【发布时间】:2017-01-01 20:13:33
【问题描述】:

如果Controller 先验证ViewModel 属性,然后使用ViewModel 属性,则ViewModel 状态在验证和使用之间更改为无效的可能性很小,从而导致异常控制流。

是否有任何常见做法或模式来确保ViewModel 状态不会改变和/或属性可以在验证后安全使用?

【问题讨论】:

    标签: validation design-patterns mvvm architecture viewmodel


    【解决方案1】:

    通过保持状态不可变,您可以确保验证和使用之间没有变化。

    例如:

    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. 蟒蛇:pyrsistent

    您对此类集合应用的任何函数都将返回一个新集合,而原始集合保持不变。这样,可以安全地共享集合,而无需锁定。

    【讨论】:

    • 我是否理解正确:1) ViewModel 它的集合仍然是可变的并且适合双向绑定到View? 2) 不可变对象尽可能多地用于属性值和内部集合? 3) 每个ViewModel 属性值都被捕获到函数范围变量中,以便以后用于验证和业务逻辑?
    • 1) 您可以进行双向绑定,也可以使用Flux 中的单向架构。 2)你的整个状态可以是一个单一的大地图(就像一个 JSON 对象)。如果您为此使用持久数据结构,由于结构共享,对此地图的部分更新是有效的。 3)您可以将整个状态捕获到函数范围或其中的任何部分,具体取决于更适合您的设计的内容。两者都同样有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-30
    • 2019-11-15
    • 2019-01-30
    • 2019-05-15
    相关资源
    最近更新 更多