基于VB的非侵入式验证组件设计
2014-06-07林志荣谢金达张金仙郑俊杰
林志荣,谢金达,张金仙,郑俊杰
(湄洲湾职业技术学院,福建莆田 351254)
基于VB的非侵入式验证组件设计
林志荣,谢金达,张金仙,郑俊杰
(湄洲湾职业技术学院,福建莆田 351254)
针对传统数据验证方法的缺陷,借鉴Web应用中非侵入式验证的思想,基于Visual Basic编程环境下通过数据输入控件与验证组件之间的映射与绑定实现数据的非侵入式验证,利用子类化技术实现类似Web表单的非侵入式验证,能够在不修改源代码和界面的情况下给程序添加数据验证功能,给出了验证组件设计的思路与主要技术。
数据验证;需求分析;非侵入式;VB
几乎所有和用户交互的应用都需要验证数据的完整性和有效性,实际项目中的数据可能有不同的类型和格式,考虑验证场所、验证时机以及验证的复杂度等因素,数据验证往往是很繁琐的。传统的数据验证可能遍布整个应用程序,验证代码的形式大同小异,与应用程序耦合度高,当验证逻辑改变时需要把所有程序重新编写,效率低、容易出错,并且代码无法重用,每次设计新项目时都要重新编写验证代码,使得应用程序的部署和维护不便[1]。
因此,在实际项目开发工作中,往往采用第三方组件,如在Web开发中的Struts、Spring等,这些组件功能强大,集成了常规的数据验证功能,能满足大多数的需要,并且提供了很强的扩展功能,在实际项目开发工作中应用广泛。第三方验证组件大大提高了数据验证效率和安全性,但对于一些较普遍而且标准的数据验证需求无法实现,如一些行业标准数据[2];其次,其主要是基于Web开发的验证技术,在桌面软件开发中实现非侵入式验证比较少见;再次,不适应对已有程序的移植或程序后期的改动。本文针对以上问题,在对软件开发中的数据验证需求分析的基础上,从实用性考虑,主要针对共性需求设计实现Visual Basic编程环境下的非侵入式验证组件,能够为已有的项目在不改动原有界面、代码的情况下方便的添加数据验证功能。
1 需求分析
1.1 功能性需求分析
考虑安全性、效率与用户体验等因素,验证组件主要针对共性需求设计,使组件尽量简单。为降低验证的复杂度,组件设计时不包含参照完整性验证 (与数据库相关,如没有库存不能下订单等)、数值比较验证 (如两次密码必须一致等)等方面的需求,功能需求分析如图1所示。
1.1.1 验证规则
①集成常规验证规则,包括数据格式 (如身份证、邮政编码等)、数据长度、数值范围、是否允许空值等;
②可扩展数据格式类型,自定义验证数据格式;
③支持多规则验证,即能够同时验证多种规则。
1.1.2 验证方法
①录入控制
录入控制是指对用户录入的字符进行检查,限制非法字符的录入。例如,某输入框要求输入身份证号码,则用户只能录入数字0到9及字母X,若用户录入其它字符则不予接受。
②非法字符过滤
录入控制虽然能保证用户录入字符的合法性,但是,当用户采用黏贴或者程序中赋值等方式输入数据时,如在身份证输入框中黏贴“张三350322185601101647”,其中含有非法字符。因此,当值通过各种方式产生变化时,应当通过对输入的数据内容进行非法字符过滤,以保证输入字符的合法性。
③域完整性验证
录入控制与非法字符过滤虽然能保证录入字符的合法性,但不能保证录入完成后整个输入域内容的合法性。如身份证号码,通过录入控制与非法字符过滤只能保证用户录入数字0到9及字母X,但无法检查用户录入的身份证号码是否合法;只有当用户将输入域内容录入完毕时,才可以检查整个输入域内容的合法性。
图1 功能需求分析
④实体完整性校验
经过域完整性验证,基本能保证用户已录的输入域内容是合法的。然而,域完整性验证也不严格,例如,可能某些域内容必须填写而用户没有填写,或者,数值超出范围等等。在用户提交数据之前必须对这些内容进行验证,验证不通过不予提交并提示更改。
1.1.3 触发方式
①对数据验证的不同阶段触发不同的验证方法,包括获得焦点触发、输入触发、值改变时触发以及离开焦点时触发、提交触发等,可以定义不同的触发方式组合。
②可调用接口触发相关的验证方法,实现自定义触发。1.1.4验证方式
①字符串验证
在需要验证一个单独的字符串或数值是否合法的情况下,这样的值并不是数据输入控件中的值,要求组件能够直接验证给定的内容。
②文本框单独验证
对单独数据输入控件实现非侵入式验证。
③表单验证
对一个Form界面上有关联的多个输入控件及提交按钮实现非侵入式验证。
1.1.5 验证结果与反馈
验证结果:
①提供丰富的验证结果信息,如验证未被触发,不允许为空值,含有非法字符,超出最大长度,未达到最小长度,超出最大值,未达到最大值,其他未知原因导致的验证失败,验证成功等。
②验证结果可查看。验证结果的反馈:
①可视化反馈
验证成功输入框边框颜色变绿;验证失败输入框边框颜色变红。为提高与目标软件的衔接,可自定义边框颜色属性。
②格式化提示信息
从用户体验考虑,当验证失败时,要给出明确的格式化提示信息,方便用户修改。如数值范围是 “(0,100)”,输入102,给出提示信息:“数值超出范围,数值不能大于等于100,当前值为102”。
③悬浮信息提示反馈
当鼠标指向输入框时,显示格式化的验证结果提示信息。
④弹出信息提示反馈
在程序运行中弹出信息提示框,显示格式化的验证结果提示信息,一般配合获得焦点反馈使用。
⑤获得焦点反馈
验证不通过在输入框中获得焦点,提示用户出错对象。
⑥事件反馈
在验证结束后,抛出Valid验证事件,用于用户自定义处理验证结果。
⑦用户自定义反馈
用户根据验证结果自定义反馈。
1.1.6 用户自定义验证
①自定义数据格式
允许用户自定义数据格式,可满足大多数验证的需求,特别是行业标准数据格式验证的扩展需求。
②自定义触发方式
提供验证方法接口,通过调用接口触发相关的验证方法,实现自定义触发。
③自定义验证结果的反馈
可以查看验证结果,以便用户根据验证结果进行反馈处理。
1.2 非功能性需求分析
大量软件开发项目经验表明,一个好的验证组件,一般要具备以下特性。
●重用性:将验证功能组件化或模块化,实现重用。
●易用性:面向对象的设计,将常用验证规则封装起来,提供接口,满足一般需求,摆脱复杂的验证逻辑。
●可扩展性:支持用户自定义验证,扩展验证规则、自定义触发方式等。
●灵活性:可以应用在多层结构中的界面层及业务逻辑层等。
●可移植性:采用非侵入式验证方式,与原有界面、代码完全隔离,可方便原有代码的移植。
2 组件设计与主要思路
2.1 组件类图
在组件中,设计了四个类来实现以上功能,如图2所示。其中cValid类主要用来注入数据输入控件,配置该输入控件的验证需求,以及数据输入控件的验证结果及反馈的处理,并对外提供验证方法接口用以实现用户自定义验证;cValids类主要用来注入提交按钮,配置并实现表单验证的需求;cSubClassCmd类是用来实现cValids类中提交按钮事件消息的拦截与处理;cSubClassTxt类用于实现cValid类中的可视化反馈。
图2 类图
2.2 主要思路
2.2.1 验证方法的实现
①录入限制
通过定义一个合法字符集属性(ValidString),用户输入字符在合法字符集内,允许输入,否则不能输入。
②非法字符过滤
也是通过合法字符集属性来判断非法字符并进行过滤。值得注意的是,在非法字符过滤时,从用户体验角度来看,要保证字符过滤后光标位置的一致性。
③域完整性验证
域完整性主要是检查输入内容格式是否满足要求,在组件设计中,通过正则表达式实现。正则表达式定义了一套自己的语法规则来完成各种资料的验证。在组件中集成了常用的数据格式 (如数字、身份证号码、邮政编码等)的正则表达式,通过ValidType属性选择;并且也定义了一个PatternString属性来设置用户自定义的正则表达式,用来实现用户自定义验证数据格式。
④实体完整性验证
实体完整性验证要验证所有规则,代码如下:
2.2.2 非侵入式验证的实现
①数据输入控件非侵入式验证的实现
在验证类中定义带事件的文本框对象,该对象在程序运行时由程序通过属性传入,实现输入框事件与验证类的映射与绑定。在验证过程中,直接通过触发验证类中的输入框事件,实现非侵入式验证,使用户代码与验证代码分开。验证类中的代码如下:
’声明带事件的输入框控件
②表单验证的实现
对一个Form界面上有关联的多个数据输入控件及提交按钮,只有全部输入控件验证通过时才能提交,否则返回错误提示信息。
主要设计思路:在程序启动或运行时,将数据输入控件及提交按钮注入到cValids类对象中,配置数据输入控件的验证需求,通过子类化技术修改提交按钮对象的默认消息处理过程。在验证过程中,通过拦截提交按钮对象的单击事件消息,触发表单验证,即验证全部数据输入控件,验证通过返回提交按钮对象的单击事件消息继续执行提交操作,否则抛出异常信息。处理流程如图3所示:
图3 表单验证的流程图
2.2.3 验证结果的可视化反馈
可视化反馈主要是通过鲜明的颜色提示,比如文本框背景变红,或者边框颜色变红等,提示用户出错的对象,以提高用户体验。实现方法也很多,包括利用画笔直接在文本框四周绘制边框等,但这种方法在控件位置、大小发生变化会导致界面混乱。因此,本文中可视化反馈的实现仍然是通过子类化技术,重绘文本框边框,并且为提高与目标软件的衔接,可自定义边框颜色属性。处理流程如图4所示:
2.2.4 用户自定义验证的实现
①自定义录入限制——通过自定义合法字符集实现。
②自定义数据格式类型——通过自定义正则表达式实现。
③自定义验证——通过调用验证接口方式实现。
④自定义验证结果的反馈处理——通过访问验证结果,根据验证结果自定义处理。
图4 重绘文本框流程图
3 实例应用测试
3.1 用户界面及验证功能要求
以一个简单的物料信息输入界面为例,界面名称为frmValids,界面布局如图5所示。该验证为一个表单验证,其中用户输入验证需求如下:
3.1.1 物料名称(Text1)
①不允许为空;②长度不能超过15个字符。
3.1.2 物料编码(Text2)
①不允许为空;
②物质编码是行业标准格式的数据类型,类似于4541(0)M001(前四位表示船舶编码,第五位为0或者1,如是船舶添加的则为0,如是岸上添加的就是1,M表示物资,后三位是流水号);
③对大小写敏感,M必须为大写。
3.1.3 数量(Text3)
①输入为整数;②不允许为空;③数值不小于1。
图5 界面
在该用户界面中的代码只处理提交过程,并不包含验证代码,数据验证是通过其他模块来实现非侵入式验证,与该界面及代码彻底分离:
’提交按钮单击事件代码
3.2 验证代码模块
3.3 运行结果
用户输入完成后,点击提交按钮,验证结果与反馈如图6所示:
图6 验证结果与反馈
4 结论
该组件针对软件开发中的验证需求,集成采用正则表达式的数据格式验证规则及常规验证规则,摆脱繁琐的验证逻辑,大大节省了时间;利用子类化技术实现数据的非侵入式验证,与原有界面及代码分开,以少代码、低耦合的方式实现集中式的数据验证功能,可维护性良好,并且有较好的交互性,在实际项目中有较好的实用性。组件设计思路也可方便移植到其他编程环境中。
〔1〕牛路军.一种基于切面技术的数据验证设计与实现方案[J].计算机安全,2007,(10):37-39.
〔2〕张言辉,姜利群,朱晴.扩展Struts验证框架实现标准化数据的验证[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,Fujian,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-),湄洲湾职业技术学院机械工程系讲师;研究方向:工程材料、计算机软件与理论。
福建省教育厅科研课题 “数据库操作及数据处理组件研发”(项目编号:JB13369)。