Validation 問題域

Validation 問題域 - 切爾斯基 - 博客頻道 - CSDN.NET http://blog.csdn.net/chelsea/article/details/5700353?locationNum=5

誰來做Validation
何時做Validation
如何表達錯誤
如何傳遞錯誤
如何關(guān)聯(lián)錯誤到發(fā)生錯誤的對象, 尤其是對象圖中非Root對象

這里的Validation指的是對進入到系統(tǒng)中的業(yè)務(wù)數(shù)據(jù)的校驗(不包括Web應(yīng)用中頁面數(shù)據(jù)在瀏覽器端的驗證)
誰來做Validation
數(shù)據(jù)的有效性不是自身所能決定的, 而是使用它的場景(Context)決定的, 因此, 每個Context應(yīng)該有自己的Validation邏輯.一個例子, 個人信息殘缺, 比如婚姻狀況沒填, 但聯(lián)系地址電子郵件等信息完備, 那么這個個人信息到底是合法還是非法? 如果你的應(yīng)用是個稅務(wù)相關(guān)的應(yīng)用必須知道婚姻狀況則數(shù)據(jù)是非法的, 如果你的應(yīng)用是CRM系統(tǒng)有客戶的聯(lián)系方式即可而婚姻狀況是可選的則數(shù)據(jù)就是合法的. 問題是你的應(yīng)用是稅務(wù)應(yīng)用但同時支持客戶關(guān)系管理, 那這段數(shù)據(jù)到底合法非法? 稅務(wù)應(yīng)用只是年底的時候才有人用, 而客戶關(guān)系管理系統(tǒng)隨時都有人用, 假設(shè)數(shù)據(jù)是通過頁面提交的, 那這批數(shù)據(jù)到底該拒絕還是接受?
何時做Validation
通常有幾個時機, 對象被創(chuàng)建出來, 對象狀態(tài)改變, 以及對象被持久化. 企業(yè)應(yīng)用中同一份數(shù)據(jù)一般至少有兩種存在形式: 在數(shù)據(jù)庫中的持久化狀態(tài), 以及在內(nèi)存中以編程語言定義的對象形式存在. 那么幾個時機:
手動創(chuàng)建對象, 就是應(yīng)在構(gòu)造函數(shù)中做驗證
框架幫忙創(chuàng)建對象, 比如從頁面Form綁定到Server端的對象時, 可以在綁定完成的那一刻做校驗
存到數(shù)據(jù)庫里那一刻

這就帶來一個問題: 可能要在三個地方做大體相同的驗證, 如何復(fù)用驗證規(guī)則?另一個問題是: 在引入ORM的應(yīng)用中, 編程語言寫好的驗證邏輯同樣可以應(yīng)用在持久化到數(shù)據(jù)庫的那一顆, 那在SQL/DDL語句中定義的約束是否還必要?
如何表達錯誤
有兩個約束:
要提供易于用戶和支持人員理解的錯誤信息
要提供盡可能豐富的信息

常見的手段是用字符串或者錯誤代碼/ID, 這是不work的, 因為它們合并了錯誤本身和錯誤的表示: 出錯的地方可能距離需要展現(xiàn)錯誤的地方很遠, 或者有多種展現(xiàn)錯誤的界面, 或者有很多顯示方面的需求, 比如支持國際化, 報錯的地方是沒有能力也不需要知道錯誤是如何被展示的, 它要做的是盡可能報告關(guān)于錯誤的詳細信息, 包括違反了什么規(guī)則, 出錯的字段, 實際的值和期待的值等, 字符串和錯誤代碼/ID是沒有如此豐富的表達能力的我們可以用對象來表達錯誤信息, 對象的類型可以表示錯誤的類別, 對象的屬性/字段可以攜帶各種與錯誤類型相關(guān)的數(shù)據(jù). 然后在需要展現(xiàn)給用戶的那一刻, 再把對象翻譯成針對那個界面的顯示, 比如可以做國際化, 或者提供給程序員更技術(shù)化的描述. 而在錯誤信息需要被顯示之前, 錯誤在系統(tǒng)中的傳遞, 都是以對象的形式進行的...聽起來跟異常Exception很像?幾個反例是.Net平臺上的異常, 比如KeyNotFoundException, 它就不告訴你那個找不到的Key是啥, 還有Index越界, 就不告訴你index的值是多少, 還有數(shù)據(jù)庫連接超時或者Transaction Timeout,死活不告訴你它等了多久超時的, 讓你搞不清楚是你的超時時間設(shè)的太短還是根本你的設(shè)置就沒生效
如何傳遞錯誤
收集參數(shù), 輸出參數(shù), Thread Local, 或者拋出異常然后合適的層次捕獲
如何關(guān)聯(lián)錯誤到發(fā)生錯誤的對象圖, 尤其是對象圖中非Root對象
給錯誤一個Key, 這個Key應(yīng)該能表示出錯的對象在對象圖中的位置, 比如Key可以是字段名稱中間用"."分隔, 級聯(lián)起來的字符串. 注意這種形式的key應(yīng)該是在調(diào)用驗證邏輯的地方組裝起來的, 而不應(yīng)該是驗證邏輯本身, 因為驗證邏輯通常并不知道自己驗證的這個對象在父對象中的字段名稱
一個額外的話題

很多驗證框架采用了基于Attribute/Anontation的方式, 這樣當(dāng)一個對象在不同的Context有不同的驗證邏輯時就會很糾結(jié), 因為它是以侵入的方式寫到對象的定義中的. 這恰恰從另一個角度說明了對象是不應(yīng)該跨Context復(fù)用的, DCI才是王道

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厚满,更是在濱河造成了極大的恐慌刊侯,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纹笼,死亡現(xiàn)場離奇詭異塑崖,居然都是意外死亡贷腕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門锨用,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丰刊,“玉大人,你說我怎么就攤上這事增拥∑潭” “怎么了单旁?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我弓颈,道長赃份,這世上最難降的妖魔是什么饿这? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任抛丽,我火速辦了婚禮,結(jié)果婚禮上晌缘,老公的妹妹穿的比我還像新娘齐莲。我一直安慰自己,他們只是感情好磷箕,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布选酗。 她就那樣靜靜地躺著,像睡著了一般搀捷。 火紅的嫁衣襯著肌膚如雪星掰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天嫩舟,我揣著相機與錄音氢烘,去河邊找鬼。 笑死家厌,一個胖子當(dāng)著我的面吹牛播玖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饭于,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蜀踏,長吁一口氣:“原來是場噩夢啊……” “哼维蒙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起果覆,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤颅痊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后局待,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斑响,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年钳榨,在試婚紗的時候發(fā)現(xiàn)自己被綠了舰罚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡薛耻,死狀恐怖营罢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饼齿,我是刑警寧澤饲漾,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站候醒,受9級特大地震影響能颁,放射性物質(zhì)發(fā)生泄漏杂瘸。R本人自食惡果不足惜倒淫,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望败玉。 院中可真熱鬧敌土,春花似錦、人聲如沸运翼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽血淌。三九已至矩欠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悠夯,已是汗流浹背癌淮。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沦补,地道東北人乳蓄。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像夕膀,于是被迫代替她去往敵國和親虚倒。 傳聞我的和親對象是個殘疾皇子美侦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內(nèi)容