資料驗證究竟該放在model還是controller
在MVC的架構裡,Model是資料抽象化的代表,所有的邏輯都應該放在Model裡,那資料驗證呢?
先說model不該做資料驗證的原因:
一、Model 並無法知道使用者情境
Model並不會直接與使用者互動,所以無法知道使用者在什麼情境下操作資料,例如Locale的不同,或是不同使用者權限等等,所以如果將資料驗證的功能都放在Model在需要考慮不同情境下的驗證,會導致Model過胖或者降低系統的擴展性。
二、錯誤反應越快越好
系統的反應速度是UX的關鍵,如果錯誤處理速度越快,使用者也會操作得更順利,如果將所有的資料驗證放在Model,很多時候要等前端的App發完request到後端的API後,等API的回應才能知道使用者的資料是否有錯誤,如果能在前端的APP完成驗證的,除了能快速回應錯誤訊息,還能少發一個request,降低後端伺服器的負擔。
三、Model 不與使用者互動
與使用者互動的主要任務是由Controller負責的,所以當資料驗證發生錯誤時,Model不該直接回傳錯誤訊息,因該由Controller來決定錯誤訊息,因為只有Controller會知道使用者的使用情境。
但Model真的不應該負責任何資料驗證嗎?
Model在資料驗證的部分主要負責的就是,資料的完整性,在資安完整性代表著這筆資料是否有被更改過,但其背後的涵義是,這筆資料是否可靠,是否Make Senses,那什麼叫做Make Senses呢?
比如說今天有一個記帳程式,有一個Account Model,這個Account有一個money的attribute,在Model中如何驗證money才適當?才符合完整性?
怎樣的money是make sense的?這樣去思考看看,答案就呼之欲出了。
驗證他是否大於零,對一個記帳來說,不應該出現負的金額,如果出現那就代表這筆資料無效,那問題來了,那是否要驗證money是否沒有小數點?答案是否。
因為不同的幣值會有不同的表示方式,如果是美金的話就可能會有小數點,所以在驗證money是否沒有小數點的驗證就要放在controller。
所以總結來說,如果是關於格式相關的驗證可以放在controller,但如果是會導致資料失去意義或者使資料無效的驗證就要放在model。
另外也有人提到如果將驗證放在controller可能會違背DRY的原則,但我想如果使用Form Object的話應該就能改善一些問題吧?
以上是個人淺見,歡迎提出任何問題討論討論。
參考資料
