0
如果Controller
首先驗證ViewModel
屬性,然後使用ViewModel
屬性,則在驗證和使用之間狀態可能會更改爲無效的可能性很小,從而導致異常控制流。確保ViewModel狀態在驗證後不會更改的實踐
有什麼常見的做法或模式,以確保ViewModel
狀態不改變和/或屬性可以驗證後可安全使用?
如果Controller
首先驗證ViewModel
屬性,然後使用ViewModel
屬性,則在驗證和使用之間狀態可能會更改爲無效的可能性很小,從而導致異常控制流。確保ViewModel狀態在驗證後不會更改的實踐
有什麼常見的做法或模式,以確保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(即數據保持其舊版本而被修改,一般是通過結構結構共享)。用於這種不可變集合的庫存在不同的語言。
你申請到這樣一個集合的任何函數會返回一個新的集合,離開原始的一個未觸及。這樣,收集可以安全地共享,而不需要鎖定。
難道我理解正確的是:1)'ViewModel',它的藏品仍然易變,適合雙向結合'View'? 2)對於屬性值和內部集合儘可能使用不可變對象? 3)每個'ViewModel'屬性值都被捕獲到函數範圍變量中,以便稍後在驗證和業務邏輯中使用? – Lightman
1)你可以做雙向綁定,也可以使用單方向的架構在[流量](https://facebook.github.io/flux/)。 2)你的整個狀態可以是一個單一的大地圖(這就像一個JSON對象)。如果您爲此使用持久數據結構,則由於結構共享,此映射的部分更新效率很高。 3)您可以將整個狀態捕捉到函數範圍或其任何部分,具體取決於您的設計更適合什麼。兩者將同樣高效。 –