2016-08-25 48 views
0

如果Controller首先驗證ViewModel屬性,然後使用ViewModel屬性,則在驗證和使用之間狀態可能會更改爲無效的可能性很小,從而導致異常控制流。確保ViewModel狀態在驗證後不會更改的實踐

有什麼常見的做法或模式,以確保ViewModel狀態不改變和/或屬性可以驗證後可安全使用?

回答

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. 淨:System.Collections.Immutable
  3. 的Java:http://www.javaslang.io/
  4. 的Python:pyrsistent

你申請到這樣一個集合的任何函數會返回一個新的集合,離開原始的一個未觸及。這樣,收集可以安全地共享,而不需要鎖定。

+0

難道我理解正確的是:1)'ViewModel',它的藏品仍然易變,適合雙向結合'View'? 2)對於屬性值和內部集合儘可能使用不可變對象? 3)每個'ViewModel'屬性值都被捕獲到函數範圍變量中,以便稍後在驗證和業務邏輯中使用? – Lightman

+0

1)你可以做雙向綁定,也可以使用單方向的架構在[流量](https://facebook.github.io/flux/)。 2)你的整個狀態可以是一個單一的大地圖(這就像一個JSON對象)。如果您爲此使用持久數據結構,則由於結構共享,此映射的部分更新效率很高。 3)您可以將整個狀態捕捉到函數範圍或其任何部分,具體取決於您的設計更適合什麼。兩者將同樣高效。 –

相關問題