以下内容带大家一起设计一个验证功能模块,既然要做一个这样的模块,我们就把有关的概念做一下设计。
验证器
package cc.soft.validate; import cc.soft.validate.ValidateException; public interface Validator { void validate(Object obj) throws ValidateException; }
验证异常类
package cc.soft.validate; @SuppressWarnings("serial") public class ValidateException extends Exception { public ValidateException() { // TODO Auto-generated constructor stub } public ValidateException(String message) { super(message); // TODO Auto-generated constructor stub } public ValidateException(Throwable cause) { super(cause); // TODO Auto-generated constructor stub } public ValidateException(String message, Throwable cause) { super(message, cause); // TODO Auto-generated constructor stub } public ValidateException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); // TODO Auto-generated constructor stub } }
验证结果
package cc.soft.validate; public class Violation { private String path; private String message; public String getPath() { return path; } public void setPath(String path) { this.path = path; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } @Override public String toString() { return "Violation [path=" + path + ", message=" + message + "]"; } }
验证规则
package cc.soft.validate; public interface ValidateRule extends ValidateNode { }
验证节点
package cc.soft.validate; import java.util.List; public interface ValidateNode { List<ValidateNode> getChildren(); void setChildren(List<ValidateNode> children); Validator[] getValidators(); void setValidators(Validator[] validators); }
验证上下文
package cc.soft.validate; import java.util.List; public interface ValidateContext { List<Violation> validate(Object target, ValidateRule rule) throws Exception; }
以上的其它模型概念都比较好理解,这里说一下ValidateNode是如何抽象出来的,假如有两个类型如下
package cc.soft.validate; public class Book { /** * 书名 */ private String name; /** * 作者 */ private Person author; public String getName() { return name; } public void setName(String name) { this.name = name; } public Person getAuthor() { return author; } public void setAuthor(Person author) { this.author = author; } }
package cc.soft.validate; public class Person { /** * 姓名 */ private String name; /** * 别名 */ private String[] alisNames; public String getName() { return name; } public void setName(String name) { this.name = name; } public String[] getAlisNames() { return alisNames; } public void setAlisNames(String[] alisNames) { this.alisNames = alisNames; } }
现有一个Book实例 book, book.getName() 可以用来描述书本名这个值,book.getOwner().getName() 可以用来描述书本作者的名字的值, book.getOwner().getAlisNames()[0] 可以用来描述书本作者的第一个别名,另外我们也可以使用另外一种,
根值(RootBean) + 路径(Path)的方式。想必用过Xpath的朋友都很熟悉了。
书本名=book + /name
作者名=book + /onwer/name
第一个别名值 = book + /owner/alisNames/1 (为什么不写成 /owner/alisNames[0], 咱就别纠结这了…… 嘿嘿,别忘了我们的目标是来讨论ValidateNode是怎么来的)
我们把路径用/切分, 是不是就切成了一节一节的, 这么一节一节的就是我们的那个ValidateNode了。藕断丝连,那么Node就是一个链式结构(先别怼我看到的Node结构不是一个链式结构),每一个Node都有0或1个上级Node, 但因为有的Node是共用的,自然就把他设计成树结构比较好点吧,这样一来,从叶子往根看,还是一条链。好了 ValidateNode#getChildren(); 这个事情算说明白了。
再看 ValidateNode#getValidators()是怎么回事。从Validator这个类角度来看,他的功能就是验证一个给定的Object值,如果不符合规则,就抛出一个ValidateException,至于规则嘛,就是模块的扩展点了,这个就符合了Validator接口的设计。 从要验证的Object值角度来看,一个值有1个或多个Validator。所以ValidateNode#getValidators()就说通了。
ValidateRule 呢,咱就认为是一个树根的 ValidateNode就行了。
这么一下来可以这么描述
/name [{验证器1},{验证器2}……]
/onwer/name [{验证器4},{验证器4}……]
/owner/alisNames/* [{验证器5},{验证器6}……]
再回头看看我们的路径描述 如 /owner/alisNames/1 切断了之后, 应该有两种类型的Node, 一种是有名称的,一种是代表集合的。因此设计如下两个类型
package cc.soft.validate.core; public class SimpleValidateNode extends AbstractValidateNode { private String name; public SimpleValidateNode(String name) { super(); this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
package cc.soft.validate.core; public class ArrayValidateNode extends AbstractValidateNode { }
好了,概念模型大概梳理已经完成,接下来就是实现这套模型了。实现的过程没什么好解释的,有兴趣的可以把代码下载来参考
在这里引入一个题外话,只有核心没有外围的东西,不好用。 我们知道一杆Q的核心 Q樘+Z弹+Z针, 但你见过一把Q只包含这三样的么, 都是为了各种需求,加上D夹呀,准镜呀 才是一个实用的Q。回到话题,规则如何定义?
在 bean上用Annotation来定义?
用 path=[验证器集合描述] 的kv方式?
还是其它的方式,外围不可轻视,决定着你的产品的易用性
以下是使用json来定义的规则,*代表的是多值字段 &代表的是子属性类型的规则定义
{ "name": [ { "type": "required", "message": "书名必填" }, { "type": "length", "minLength": "3", "message": "书名长度不小于3" } ], "author": [ { "type": "required", "message": "书名作者必填" } ], "author&": { "name": [ { "type": "required", "message": "姓名必填" } ], "alisNames": [ { "type": "required", "message": "别名必填" } ], "alisNames*": [ { "type": "required", "message": "值必填" }, { "type": "length", "minLength": "3", "message": "别名长度不小于3" } ] } }
好了,第一次写文章,到此为止。
相关推荐
学生将学习如何创建工程、编写Verilog代码、设置约束条件、进行仿真验证以及生成比特流文件,最后将设计下载到FPGA中进行硬件验证。 Verilog HDL,作为一种硬件描述语言,是FPGA设计的核心。通过学习Verilog,...
网络通信模块是现代电子设备中不可或缺的部分,它们负责...这个"网络通信模块原理图PCB设计资料"将帮助工程师深入理解网络通信模块的设计过程,从理论到实践,提升设计技能,从而创建出高效、可靠的网络通信解决方案。
**HC_05模块原理图详解** HC_05是一款广泛应用在嵌入式系统和物联网设备中的蓝牙串口模块,它允许用户通过串行通信接口(UART)与蓝牙设备进行无线连接。本压缩包文件提供了关于HC_05模块的全方位资源,包括原理图...
1. QQ验证模块:这是核心部分,可能包含了一系列的函数或方法,用于构建验证请求、发送请求、解析响应等功能。 2. 实例源码:提供了如何使用这个模块的具体代码示例,开发者可以通过阅读和运行这些代码,理解验证...
AS608指纹模块是一款基于AS60x系列的高性能指纹识别模块,广泛应用于安全门锁、考勤系统、支付设备等领域。...从理论学习到实践操作,从硬件设计到软件编程,每一个环节都有相应的指导,是AS608开发者的理想工具包。
开发者只需将模块导入到自己的项目中,就可以快速实现网络验证功能,无需从头编写所有代码。 5. **学习与实践**: 对于学习易语言的开发者来说,这份资源提供了一个实战性的案例,有助于提升对网络验证机制的理解...
5. **可靠性验证**:进行长时间运行测试,评估模块的可靠性和寿命。 微波雷达感应模块的原理和调试是一个涉及硬件、软件和系统集成的复杂过程。对于初入行的工程师来说,理解这些基本概念并掌握实际操作技巧是至关...
这个模块包括了原理图、PCB(印刷电路板)文件以及仿真文件,为用户提供了完整的硬件设计和验证流程。 首先,让我们了解一下51单片机。51系列单片机是Intel公司推出的8位微处理器,以其简单易用、性价比高而被广泛...
通过学习这个易语言网络验证模块源码,你可以深入理解网络编程的基本原理,掌握易语言在实际项目中的应用,同时也能提升在软件授权验证方面的技能。无论是为了个人学习还是商业项目,这都是一次宝贵的实践机会。记得...
总的来说,这个压缩包提供的资料对于学习和实践A4988步进电机控制电路模块的设计是非常全面的。无论是初学者还是经验丰富的工程师,都可以通过研究这些文件来提升自己的硬件设计能力。你可以通过ALTIUM Designer软件...
《TDA7266D语音模块:原理与实践》 TDA7266D是一款广泛应用在音频系统中的功放芯片,尤其适用于语音模块的设计。这款芯片以其高效率、低失真和良好的电源抑制比而备受工程师青睐。在本文中,我们将深入探讨TDA7266D...
在本项目中,提供的是一个已完成打板验证的AD(Altium Designer)格式的π型滤波电路模块原理图和PCB源文件。 π型滤波器的核心在于其三段式结构,每一端都对应一个电容,中间由两个电感相连。这种设计使得π型...
4. **安全与隐私**:在使用这类验证模块时,开发者需要确保符合YY平台的API使用规定,尊重用户隐私,不滥用用户信息,并且遵循相关的安全最佳实践,防止数据泄露或被恶意利用。 5. **应用拓展**:此模块可以广泛...
编译原理是计算机科学中的核心部分,它涉及到如何将高级编程语言转化为机器可理解的指令,这一过程称为编译。通过学习编译原理,我们可以更好地理解程序的底层工作方式,优化代码,甚至自行构建编译器。 编译器的...
VirtualService用于定义请求如何路由到不同的服务,DestinationRule则用于设置到达特定服务的策略,如负载均衡、熔断和重试规则。 在实践中,Istio的应用场景广泛,包括: - **流量管理**:通过智能路由实现灰度...
源代码是程序的原始形式,通过阅读和分析源码,我们可以了解到密码验证模块的工作原理,包括如何进行用户身份验证,如何处理加密和解密过程,以及如何与服务器进行代理通信等。 易语言的语法结构简洁明了,它的基础...
无线收发模块是电子工程...综上所述,无线收发模块的设计涉及多个方面,从理论知识到实践操作,每个环节都需要细致入微的考虑。通过研究提供的压缩包文件,可以深入学习无线通信技术,为实际项目开发打下坚实的基础。
总的来说,“随机数字验证模块”是一个实践性的教程,它教你如何在ASP.NET 2.0环境中创建一个有效的图文验证码系统,以提升网站的安全性。学习这个模块不仅有助于提高你的Web开发技能,还能让你了解验证码技术背后的...
- 对于小团队开发:对于小型团队来说,此源码可以作为快速开发的基础,节省从零开始编写验证模块的时间。团队成员可以通过修改和扩展源码,以适应特定项目的需求,比如增加多因素认证、支持不同类型的数据库等。 4...