林志榮,謝金達(dá),張金仙,鄭俊杰
(湄洲灣職業(yè)技術(shù)學(xué)院,福建莆田 351254)
基于VB的非侵入式驗證組件設(shè)計
林志榮,謝金達(dá),張金仙,鄭俊杰
(湄洲灣職業(yè)技術(shù)學(xué)院,福建莆田 351254)
針對傳統(tǒng)數(shù)據(jù)驗證方法的缺陷,借鑒Web應(yīng)用中非侵入式驗證的思想,基于Visual Basic編程環(huán)境下通過數(shù)據(jù)輸入控件與驗證組件之間的映射與綁定實現(xiàn)數(shù)據(jù)的非侵入式驗證,利用子類化技術(shù)實現(xiàn)類似Web表單的非侵入式驗證,能夠在不修改源代碼和界面的情況下給程序添加數(shù)據(jù)驗證功能,給出了驗證組件設(shè)計的思路與主要技術(shù)。
數(shù)據(jù)驗證;需求分析;非侵入式;VB
幾乎所有和用戶交互的應(yīng)用都需要驗證數(shù)據(jù)的完整性和有效性,實際項目中的數(shù)據(jù)可能有不同的類型和格式,考慮驗證場所、驗證時機(jī)以及驗證的復(fù)雜度等因素,數(shù)據(jù)驗證往往是很繁瑣的。傳統(tǒng)的數(shù)據(jù)驗證可能遍布整個應(yīng)用程序,驗證代碼的形式大同小異,與應(yīng)用程序耦合度高,當(dāng)驗證邏輯改變時需要把所有程序重新編寫,效率低、容易出錯,并且代碼無法重用,每次設(shè)計新項目時都要重新編寫驗證代碼,使得應(yīng)用程序的部署和維護(hù)不便[1]。
因此,在實際項目開發(fā)工作中,往往采用第三方組件,如在Web開發(fā)中的Struts、Spring等,這些組件功能強(qiáng)大,集成了常規(guī)的數(shù)據(jù)驗證功能,能滿足大多數(shù)的需要,并且提供了很強(qiáng)的擴(kuò)展功能,在實際項目開發(fā)工作中應(yīng)用廣泛。第三方驗證組件大大提高了數(shù)據(jù)驗證效率和安全性,但對于一些較普遍而且標(biāo)準(zhǔn)的數(shù)據(jù)驗證需求無法實現(xiàn),如一些行業(yè)標(biāo)準(zhǔn)數(shù)據(jù)[2];其次,其主要是基于Web開發(fā)的驗證技術(shù),在桌面軟件開發(fā)中實現(xiàn)非侵入式驗證比較少見;再次,不適應(yīng)對已有程序的移植或程序后期的改動。本文針對以上問題,在對軟件開發(fā)中的數(shù)據(jù)驗證需求分析的基礎(chǔ)上,從實用性考慮,主要針對共性需求設(shè)計實現(xiàn)Visual Basic編程環(huán)境下的非侵入式驗證組件,能夠為已有的項目在不改動原有界面、代碼的情況下方便的添加數(shù)據(jù)驗證功能。
1.1 功能性需求分析
考慮安全性、效率與用戶體驗等因素,驗證組件主要針對共性需求設(shè)計,使組件盡量簡單。為降低驗證的復(fù)雜度,組件設(shè)計時不包含參照完整性驗證 (與數(shù)據(jù)庫相關(guān),如沒有庫存不能下訂單等)、數(shù)值比較驗證 (如兩次密碼必須一致等)等方面的需求,功能需求分析如圖1所示。
1.1.1 驗證規(guī)則
①集成常規(guī)驗證規(guī)則,包括數(shù)據(jù)格式 (如身份證、郵政編碼等)、數(shù)據(jù)長度、數(shù)值范圍、是否允許空值等;
②可擴(kuò)展數(shù)據(jù)格式類型,自定義驗證數(shù)據(jù)格式;
③支持多規(guī)則驗證,即能夠同時驗證多種規(guī)則。
1.1.2 驗證方法
①錄入控制
錄入控制是指對用戶錄入的字符進(jìn)行檢查,限制非法字符的錄入。例如,某輸入框要求輸入身份證號碼,則用戶只能錄入數(shù)字0到9及字母X,若用戶錄入其它字符則不予接受。
②非法字符過濾
錄入控制雖然能保證用戶錄入字符的合法性,但是,當(dāng)用戶采用黏貼或者程序中賦值等方式輸入數(shù)據(jù)時,如在身份證輸入框中黏貼“張三350322185601101647”,其中含有非法字符。因此,當(dāng)值通過各種方式產(chǎn)生變化時,應(yīng)當(dāng)通過對輸入的數(shù)據(jù)內(nèi)容進(jìn)行非法字符過濾,以保證輸入字符的合法性。
③域完整性驗證
錄入控制與非法字符過濾雖然能保證錄入字符的合法性,但不能保證錄入完成后整個輸入域內(nèi)容的合法性。如身份證號碼,通過錄入控制與非法字符過濾只能保證用戶錄入數(shù)字0到9及字母X,但無法檢查用戶錄入的身份證號碼是否合法;只有當(dāng)用戶將輸入域內(nèi)容錄入完畢時,才可以檢查整個輸入域內(nèi)容的合法性。

圖1 功能需求分析
④實體完整性校驗
經(jīng)過域完整性驗證,基本能保證用戶已錄的輸入域內(nèi)容是合法的。然而,域完整性驗證也不嚴(yán)格,例如,可能某些域內(nèi)容必須填寫而用戶沒有填寫,或者,數(shù)值超出范圍等等。在用戶提交數(shù)據(jù)之前必須對這些內(nèi)容進(jìn)行驗證,驗證不通過不予提交并提示更改。
1.1.3 觸發(fā)方式
①對數(shù)據(jù)驗證的不同階段觸發(fā)不同的驗證方法,包括獲得焦點觸發(fā)、輸入觸發(fā)、值改變時觸發(fā)以及離開焦點時觸發(fā)、提交觸發(fā)等,可以定義不同的觸發(fā)方式組合。
②可調(diào)用接口觸發(fā)相關(guān)的驗證方法,實現(xiàn)自定義觸發(fā)。1.1.4驗證方式
①字符串驗證
在需要驗證一個單獨(dú)的字符串或數(shù)值是否合法的情況下,這樣的值并不是數(shù)據(jù)輸入控件中的值,要求組件能夠直接驗證給定的內(nèi)容。
②文本框單獨(dú)驗證
對單獨(dú)數(shù)據(jù)輸入控件實現(xiàn)非侵入式驗證。
③表單驗證
對一個Form界面上有關(guān)聯(lián)的多個輸入控件及提交按鈕實現(xiàn)非侵入式驗證。
1.1.5 驗證結(jié)果與反饋
驗證結(jié)果:
①提供豐富的驗證結(jié)果信息,如驗證未被觸發(fā),不允許為空值,含有非法字符,超出最大長度,未達(dá)到最小長度,超出最大值,未達(dá)到最大值,其他未知原因?qū)е碌尿炞C失敗,驗證成功等。
②驗證結(jié)果可查看。驗證結(jié)果的反饋:
①可視化反饋
驗證成功輸入框邊框顏色變綠;驗證失敗輸入框邊框顏色變紅。為提高與目標(biāo)軟件的銜接,可自定義邊框顏色屬性。
②格式化提示信息
從用戶體驗考慮,當(dāng)驗證失敗時,要給出明確的格式化提示信息,方便用戶修改。如數(shù)值范圍是 “(0,100)”,輸入102,給出提示信息:“數(shù)值超出范圍,數(shù)值不能大于等于100,當(dāng)前值為102”。
③懸浮信息提示反饋
當(dāng)鼠標(biāo)指向輸入框時,顯示格式化的驗證結(jié)果提示信息。
④彈出信息提示反饋
在程序運(yùn)行中彈出信息提示框,顯示格式化的驗證結(jié)果提示信息,一般配合獲得焦點反饋使用。
⑤獲得焦點反饋
驗證不通過在輸入框中獲得焦點,提示用戶出錯對象。
⑥事件反饋
在驗證結(jié)束后,拋出Valid驗證事件,用于用戶自定義處理驗證結(jié)果。
⑦用戶自定義反饋
用戶根據(jù)驗證結(jié)果自定義反饋。
1.1.6 用戶自定義驗證
①自定義數(shù)據(jù)格式
允許用戶自定義數(shù)據(jù)格式,可滿足大多數(shù)驗證的需求,特別是行業(yè)標(biāo)準(zhǔn)數(shù)據(jù)格式驗證的擴(kuò)展需求。
②自定義觸發(fā)方式
提供驗證方法接口,通過調(diào)用接口觸發(fā)相關(guān)的驗證方法,實現(xiàn)自定義觸發(fā)。
③自定義驗證結(jié)果的反饋
可以查看驗證結(jié)果,以便用戶根據(jù)驗證結(jié)果進(jìn)行反饋處理。
1.2 非功能性需求分析
大量軟件開發(fā)項目經(jīng)驗表明,一個好的驗證組件,一般要具備以下特性。
●重用性:將驗證功能組件化或模塊化,實現(xiàn)重用。
●易用性:面向?qū)ο蟮脑O(shè)計,將常用驗證規(guī)則封裝起來,提供接口,滿足一般需求,擺脫復(fù)雜的驗證邏輯。
●可擴(kuò)展性:支持用戶自定義驗證,擴(kuò)展驗證規(guī)則、自定義觸發(fā)方式等。
●靈活性:可以應(yīng)用在多層結(jié)構(gòu)中的界面層及業(yè)務(wù)邏輯層等。
●可移植性:采用非侵入式驗證方式,與原有界面、代碼完全隔離,可方便原有代碼的移植。
2.1 組件類圖
在組件中,設(shè)計了四個類來實現(xiàn)以上功能,如圖2所示。其中cValid類主要用來注入數(shù)據(jù)輸入控件,配置該輸入控件的驗證需求,以及數(shù)據(jù)輸入控件的驗證結(jié)果及反饋的處理,并對外提供驗證方法接口用以實現(xiàn)用戶自定義驗證;cValids類主要用來注入提交按鈕,配置并實現(xiàn)表單驗證的需求;cSubClassCmd類是用來實現(xiàn)cValids類中提交按鈕事件消息的攔截與處理;cSubClassTxt類用于實現(xiàn)cValid類中的可視化反饋。

圖2 類圖
2.2 主要思路
2.2.1 驗證方法的實現(xiàn)
①錄入限制
通過定義一個合法字符集屬性(ValidString),用戶輸入字符在合法字符集內(nèi),允許輸入,否則不能輸入。
②非法字符過濾
也是通過合法字符集屬性來判斷非法字符并進(jìn)行過濾。值得注意的是,在非法字符過濾時,從用戶體驗角度來看,要保證字符過濾后光標(biāo)位置的一致性。
③域完整性驗證
域完整性主要是檢查輸入內(nèi)容格式是否滿足要求,在組件設(shè)計中,通過正則表達(dá)式實現(xiàn)。正則表達(dá)式定義了一套自己的語法規(guī)則來完成各種資料的驗證。在組件中集成了常用的數(shù)據(jù)格式 (如數(shù)字、身份證號碼、郵政編碼等)的正則表達(dá)式,通過ValidType屬性選擇;并且也定義了一個PatternString屬性來設(shè)置用戶自定義的正則表達(dá)式,用來實現(xiàn)用戶自定義驗證數(shù)據(jù)格式。
④實體完整性驗證
實體完整性驗證要驗證所有規(guī)則,代碼如下:


2.2.2 非侵入式驗證的實現(xiàn)
①數(shù)據(jù)輸入控件非侵入式驗證的實現(xiàn)
在驗證類中定義帶事件的文本框?qū)ο?,該對象在程序運(yùn)行時由程序通過屬性傳入,實現(xiàn)輸入框事件與驗證類的映射與綁定。在驗證過程中,直接通過觸發(fā)驗證類中的輸入框事件,實現(xiàn)非侵入式驗證,使用戶代碼與驗證代碼分開。驗證類中的代碼如下:
’聲明帶事件的輸入框控件

②表單驗證的實現(xiàn)
對一個Form界面上有關(guān)聯(lián)的多個數(shù)據(jù)輸入控件及提交按鈕,只有全部輸入控件驗證通過時才能提交,否則返回錯誤提示信息。
主要設(shè)計思路:在程序啟動或運(yùn)行時,將數(shù)據(jù)輸入控件及提交按鈕注入到cValids類對象中,配置數(shù)據(jù)輸入控件的驗證需求,通過子類化技術(shù)修改提交按鈕對象的默認(rèn)消息處理過程。在驗證過程中,通過攔截提交按鈕對象的單擊事件消息,觸發(fā)表單驗證,即驗證全部數(shù)據(jù)輸入控件,驗證通過返回提交按鈕對象的單擊事件消息繼續(xù)執(zhí)行提交操作,否則拋出異常信息。處理流程如圖3所示:

圖3 表單驗證的流程圖
2.2.3 驗證結(jié)果的可視化反饋
可視化反饋主要是通過鮮明的顏色提示,比如文本框背景變紅,或者邊框顏色變紅等,提示用戶出錯的對象,以提高用戶體驗。實現(xiàn)方法也很多,包括利用畫筆直接在文本框四周繪制邊框等,但這種方法在控件位置、大小發(fā)生變化會導(dǎo)致界面混亂。因此,本文中可視化反饋的實現(xiàn)仍然是通過子類化技術(shù),重繪文本框邊框,并且為提高與目標(biāo)軟件的銜接,可自定義邊框顏色屬性。處理流程如圖4所示:
2.2.4 用戶自定義驗證的實現(xiàn)
①自定義錄入限制——通過自定義合法字符集實現(xiàn)。
②自定義數(shù)據(jù)格式類型——通過自定義正則表達(dá)式實現(xiàn)。
③自定義驗證——通過調(diào)用驗證接口方式實現(xiàn)。
④自定義驗證結(jié)果的反饋處理——通過訪問驗證結(jié)果,根據(jù)驗證結(jié)果自定義處理。

圖4 重繪文本框流程圖
3.1 用戶界面及驗證功能要求
以一個簡單的物料信息輸入界面為例,界面名稱為frmValids,界面布局如圖5所示。該驗證為一個表單驗證,其中用戶輸入驗證需求如下:
3.1.1 物料名稱(Text1)
①不允許為空;②長度不能超過15個字符。
3.1.2 物料編碼(Text2)
①不允許為空;
②物質(zhì)編碼是行業(yè)標(biāo)準(zhǔn)格式的數(shù)據(jù)類型,類似于4541(0)M001(前四位表示船舶編碼,第五位為0或者1,如是船舶添加的則為0,如是岸上添加的就是1,M表示物資,后三位是流水號);
③對大小寫敏感,M必須為大寫。
3.1.3 數(shù)量(Text3)
①輸入為整數(shù);②不允許為空;③數(shù)值不小于1。

圖5 界面
在該用戶界面中的代碼只處理提交過程,并不包含驗證代碼,數(shù)據(jù)驗證是通過其他模塊來實現(xiàn)非侵入式驗證,與該界面及代碼徹底分離:
’提交按鈕單擊事件代碼

3.2 驗證代碼模塊


3.3 運(yùn)行結(jié)果
用戶輸入完成后,點擊提交按鈕,驗證結(jié)果與反饋如圖6所示:

圖6 驗證結(jié)果與反饋
該組件針對軟件開發(fā)中的驗證需求,集成采用正則表達(dá)式的數(shù)據(jù)格式驗證規(guī)則及常規(guī)驗證規(guī)則,擺脫繁瑣的驗證邏輯,大大節(jié)省了時間;利用子類化技術(shù)實現(xiàn)數(shù)據(jù)的非侵入式驗證,與原有界面及代碼分開,以少代碼、低耦合的方式實現(xiàn)集中式的數(shù)據(jù)驗證功能,可維護(hù)性良好,并且有較好的交互性,在實際項目中有較好的實用性。組件設(shè)計思路也可方便移植到其他編程環(huán)境中。
〔1〕牛路軍.一種基于切面技術(shù)的數(shù)據(jù)驗證設(shè)計與實現(xiàn)方案[J].計算機(jī)安全,2007,(10):37-39.
〔2〕張言輝,姜利群,朱晴.擴(kuò)展Struts驗證框架實現(xiàn)標(biāo)準(zhǔn)化數(shù)據(jù)的驗證[J].微計算機(jī)信息,2010,(03):126-127,149.
Design of Non-intrusive Verification Components Based on VB
Lin Zhirong,Xie Jinda,Zhang Jinxian,Zheng Junjie
(Meizhouwan Vocational Technology College,Putian,F(xiàn)ujian,351254)
According to the limitation of traditional verification method,applying non-intrusive verification ideas in web application,the author tries to realize data non-intrusive verification bymapping and binding between data input controland verification of componentsbase on VB.By using sub-classified technique to achieve a similar Web form non-intrusive verification,the author adds data validation function to the program withoutmodify the source code and interface.Finally,the paper gives ideas and main technology about design of verification component.
data validation;demand analysis;non-intrusive;VB
TP311
A
1009-9522(2014)02-0008-06
2014-02-21
林志榮 (1984-),湄洲灣職業(yè)技術(shù)學(xué)院機(jī)械工程系講師;研究方向:工程材料、計算機(jī)軟件與理論。
福建省教育廳科研課題 “數(shù)據(jù)庫操作及數(shù)據(jù)處理組件研發(fā)”(項目編號:JB13369)。