`
linxueqin
  • 浏览: 266 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

验证模块从原理到实践

阅读更多

        以下内容带大家一起设计一个验证功能模块,既然要做一个这样的模块,我们就把有关的概念做一下设计。

 

验证器

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"
			}
		]
	}
}

  

 

好了,第一次写文章,到此为止。

 

 

 

 

分享到:
评论

相关推荐

    Xilinx FPGA原理与实践—基于Vivado和Verilog HDL 课件

    学生将学习如何创建工程、编写Verilog代码、设置约束条件、进行仿真验证以及生成比特流文件,最后将设计下载到FPGA中进行硬件验证。 Verilog HDL,作为一种硬件描述语言,是FPGA设计的核心。通过学习Verilog,...

    网路通信模块原理图PCB设计资料

    网络通信模块是现代电子设备中不可或缺的部分,它们负责...这个"网络通信模块原理图PCB设计资料"将帮助工程师深入理解网络通信模块的设计过程,从理论到实践,提升设计技能,从而创建出高效、可靠的网络通信解决方案。

    HC_05 模块原理图

    **HC_05模块原理图详解** HC_05是一款广泛应用在嵌入式系统和物联网设备中的蓝牙串口模块,它允许用户通过串行通信接口(UART)与蓝牙设备进行无线连接。本压缩包文件提供了关于HC_05模块的全方位资源,包括原理图...

    易语言QQ验证模块以及实例源码

    1. QQ验证模块:这是核心部分,可能包含了一系列的函数或方法,用于构建验证请求、发送请求、解析响应等功能。 2. 实例源码:提供了如何使用这个模块的具体代码示例,开发者可以通过阅读和运行这些代码,理解验证...

    AS608指纹模块_原理图、程序、上位机、尺寸图等

    AS608指纹模块是一款基于AS60x系列的高性能指纹识别模块,广泛应用于安全门锁、考勤系统、支付设备等领域。...从理论学习到实践操作,从硬件设计到软件编程,每一个环节都有相应的指导,是AS608开发者的理想工具包。

    飘零网络验证源码以及模块.zip

    开发者只需将模块导入到自己的项目中,就可以快速实现网络验证功能,无需从头编写所有代码。 5. **学习与实践**: 对于学习易语言的开发者来说,这份资源提供了一个实战性的案例,有助于提升对网络验证机制的理解...

    微波(雷达)感应模块原理调试

    5. **可靠性验证**:进行长时间运行测试,评估模块的可靠性和寿命。 微波雷达感应模块的原理和调试是一个涉及硬件、软件和系统集成的复杂过程。对于初入行的工程师来说,理解这些基本概念并掌握实际操作技巧是至关...

    基于51单片机的光控模块 含原理图、PCB文件、仿真文件

    这个模块包括了原理图、PCB(印刷电路板)文件以及仿真文件,为用户提供了完整的硬件设计和验证流程。 首先,让我们了解一下51单片机。51系列单片机是Intel公司推出的8位微处理器,以其简单易用、性价比高而被广泛...

    易语言源码易语言网络验证模块源码.rar

    通过学习这个易语言网络验证模块源码,你可以深入理解网络编程的基本原理,掌握易语言在实际项目中的应用,同时也能提升在软件授权验证方面的技能。无论是为了个人学习还是商业项目,这都是一次宝贵的实践机会。记得...

    A4988步进电机控制电路模块ALTIUM设计硬件原理图+PCB+3D封装库文件.zip

    总的来说,这个压缩包提供的资料对于学习和实践A4988步进电机控制电路模块的设计是非常全面的。无论是初学者还是经验丰富的工程师,都可以通过研究这些文件来提升自己的硬件设计能力。你可以通过ALTIUM Designer软件...

    TDA7266D语音模块原理图+pcb文件

    《TDA7266D语音模块:原理与实践》 TDA7266D是一款广泛应用在音频系统中的功放芯片,尤其适用于语音模块的设计。这款芯片以其高效率、低失真和良好的电源抑制比而备受工程师青睐。在本文中,我们将深入探讨TDA7266D...

    π型滤波电路模块 原理图与PCB源文件 AD格式 已打板验证

    在本项目中,提供的是一个已完成打板验证的AD(Altium Designer)格式的π型滤波电路模块原理图和PCB源文件。 π型滤波器的核心在于其三段式结构,每一端都对应一个电容,中间由两个电感相连。这种设计使得π型...

    易语言验证YY频道和群模块

    4. **安全与隐私**:在使用这类验证模块时,开发者需要确保符合YY平台的API使用规定,尊重用户隐私,不滥用用户信息,并且遵循相关的安全最佳实践,防止数据泄露或被恶意利用。 5. **应用拓展**:此模块可以广泛...

    《编译原理及实践》源码

    编译原理是计算机科学中的核心部分,它涉及到如何将高级编程语言转化为机器可理解的指令,这一过程称为编译。通过学习编译原理,我们可以更好地理解程序的底层工作方式,优化代码,甚至自行构建编译器。 编译器的...

    云原生服务网格Istio:原理、实践、架构与源码解析.zip

    VirtualService用于定义请求如何路由到不同的服务,DestinationRule则用于设置到达特定服务的策略,如负载均衡、熔断和重试规则。 在实践中,Istio的应用场景广泛,包括: - **流量管理**:通过智能路由实现灰度...

    易语言源码密码代理验证模块源码.rar

    源代码是程序的原始形式,通过阅读和分析源码,我们可以了解到密码验证模块的工作原理,包括如何进行用户身份验证,如何处理加密和解密过程,以及如何与服务器进行代理通信等。 易语言的语法结构简洁明了,它的基础...

    无线收发模块(方案设计.原理图).rar

    无线收发模块是电子工程...综上所述,无线收发模块的设计涉及多个方面,从理论知识到实践操作,每个环节都需要细致入微的考虑。通过研究提供的压缩包文件,可以深入学习无线通信技术,为实际项目开发打下坚实的基础。

    随机数字验证模块

    总的来说,“随机数字验证模块”是一个实践性的教程,它教你如何在ASP.NET 2.0环境中创建一个有效的图文验证码系统,以提升网站的安全性。学习这个模块不仅有助于提高你的Web开发技能,还能让你了解验证码技术背后的...

    易语言密码代理验证模块源码.zip易语言项目例子源码下载

    - 对于小团队开发:对于小型团队来说,此源码可以作为快速开发的基础,节省从零开始编写验证模块的时间。团队成员可以通过修改和扩展源码,以适应特定项目的需求,比如增加多因素认证、支持不同类型的数据库等。 4...

Global site tag (gtag.js) - Google Analytics