假設您有一個可以完成某種工作的子系統。它可能是任何東西。顯然,在這個子系統的入口點上,輸入會有一定的限制。假設這個子系統主要由GUI來調用。子系統需要檢查它收到的所有輸入以確保它是有效的。如果輸入無效,我們不想FireTheMissles()。 UI也對驗證感興趣,因爲它需要報告出錯的地方。也許用戶忘了指定一個目標或者在啓動板本身瞄準導彈。當然,你可以返回一個空值或者拋出一個異常,但是這並不能告訴用戶什麼地方出錯了(當然,除非你爲每個錯誤編寫一個單獨的異常類,如果if這是最佳做法)。在輸入驗證中避免重複的代碼
當然,即使有例外,你也有問題。用戶可能想知道輸入是否有效,然後單擊「Fire Missles!」按鈕。你可以編寫一個單獨的驗證函數(當然IsValid()並沒有真正的幫助很多,因爲它不會告訴你什麼出了問題),但是你會從按鈕點擊處理函數中調用它,然後再從FireTheMissles中調用它( )函數(我真的不知道這是如何從一個模糊的子系統變成一個引火計劃)。當然,這並不是世界的盡頭,但似乎很愚蠢的是連續調用兩次相同的驗證函數而沒有任何改變,特別是如果這個驗證函數需要計算1GB文件的散列值。
如果函數的前提條件是清晰的,GUI可以進行自己的輸入驗證,但是我們只是複製了輸入驗證邏輯,而其中的更改可能不會反映在另一箇中。當然,我們可以在GUI上添加一張支票以確保導彈目標不在盟國內,但如果我們忘記將它複製到FireTheMissles()例程中,那麼當我們切換到時會意外炸燬我們的盟友一個控制檯界面。
因此,簡而言之,你如何實現以下目標:
- 輸入驗證,告訴你不只是出事了,但具體是什麼地方出了錯。
- 能夠在不調用依賴它的函數的情況下運行此輸入驗證。
- 沒有雙重驗證。
- 沒有重複的代碼。
另外,我只是想到了這一點,但錯誤消息不應該寫在FireTheMissles()方法中。 GUI負責選擇適當的錯誤消息,而不是GUI調用的代碼。
MVC比輸入驗證要多得多。當它到達輸入驗證本身時,你所建議的與Binary Worrier提出的有什麼不同?如果是這樣,怎麼樣?如果沒有,那麼爲了實現這種錯誤處理方法,是否真的有必要做MVC? (並不是說最終的應用程序肯定不會是MVC,但我甚至沒有考慮過GUI,除非知道它將需要從我的導彈發射子系統中得到什麼。) – 2009-05-19 13:07:43
+1簡而言之:模型定義它的任何部分是有效的,任何人都必須確保他們聽從這些限制。 – 2009-05-19 14:20:22