新增、修改操作时自定义复杂逻辑校验-2022新项目
一、业务场景
项目开发中常规的操作免不了会有新增和修改,这两个操作中有很多内容都是相同的比如参数的校验方式,几乎
都是一模一样的,对于其中不能使用 Validation 校验的逻辑,需要自主校验的逻辑也完全是一模一样的。某些校验是
有另外一个校验作为前提,这时使用 Validation 来进行校验就实现不了。举个例子:如果是举办活动,活动类型为线下
活动,则需要填写活动地址;如果是线上活动则不需要举办地址,这种校验只能采取手动检验。
二、需求分析
最开始的时候自己是写两遍代码,新增的时候写一遍自定义的校验逻辑,修改的时候在写一遍校验的逻辑,这种方式也
没什么毛病,反正都是复制粘贴。可是当其中的校验逻辑短期内确定不下来的时候,时不时修改起来就感觉很麻烦,每次都
需要修改两个地方。自己在考虑有没有什么简便的方法来解决这个问题呢?让自己只写一遍代码,只改一个地方就能达到同
样的效果呢?
三、解决方案
有这种想法后,自己就在不断地思考,首先能够考虑到的就是抽取校验逻辑到一个方法中,这样就只需要修改一次即可。
可是这样处理的话,新增和修改操作中如何知道是校验通过还是不通过?这就需要一个返回值,继而考虑如何在构造这个返回
值对象,校验时有两点是需要知晓的,校验结果通过还是不通过。如果不通过,则不通过的原因是什么,即是错误信息。根据
这个分析设计做出一个简单的校验类如下:
/**
* @Author yilang
* @Description 校验结果返回类
* @Date 2022/7/16 16:21
* @Version 1.0
*/
@Data
public class ValidateResult {
/*
* 校验结果
*/
private boolean result;
/*
* 错误信息
*/
private String errorMessage;
}
经过简单的尝试,发现这种方式能够达到要求。在抽取的私有自定义校验方法中的第一行,先创建一个
空对象,然后进行校验操作。当校验不通过的时候,将其值设置false,同时设置错误信息,最后返回
该对象。在新增方法中调用该方法,如果校验不通过则直接返回,并且将该错误信息一并返回,修改方法
中也是同样的处理方式。经过测试这种方式完全可行,之后写自定义的复杂逻辑校验时,只需要写一遍
代码即可,减少了代码量,让代码更加地简洁。后来经过不断地改进,最终的类定义如下:
import lombok.Data;
/**
* @Author yilang
* @Description 校验结果返回类
* @Date 2022/7/16 16:21
* @Version 1.0
*/
@Data
public class ValidateResult {
public ValidateResult() {}
public ValidateResult(boolean defaultResult) {
this.result = defaultResult;
}
/*
* 校验结果
*/
private boolean result = false;
/*
* 错误信息
*/
private String errorMessage = "";
public ValidateResult setResult(boolean result) {
this.result = result;
return this;
}
public ValidateResult setErrorMessage(String errorMessage) {
this.errorMessage = errorMessage;
return this;
}
}
这种方式更加的简化,也更加的灵活。伪代码如下,直接创建空对象,校验结果默认为false,
如果校验不通过,则直接返回。最终校验通过就给一个值true,如下示例
ValidateResult validateResult = new ValidateResult();
//校验逻辑
//校验不通过
return validateResult.setErrorMessage("错误信息");
//校验逻辑
return validateResult.setResult(true);
如果创建该对象时,想给一个默认值为 true,也可以通过有参构造在传入,这个看个人的习惯。这种方式
通过测试完全可行,有其他好方法的小伙伴欢迎留言。