gpt4 book ai didi

java - 如何重构 validator

转载 作者:行者123 更新时间:2023-12-02 06:42:43 25 4
gpt4 key购买 nike

我正在考虑 validator 的良好实现。我的服务方法是这样开始的:

if(badSituation()){
return Response.status(400).entity("bad situtaion").build();
}
if(badSituation2()){
return Response.status(400).entity("bad situtaion2").build();
}
...
if(badSituationN()){
return Response.status(400).entity("bad situtaionN").build();
}

由于 validator 的倍增速度非常快,我决定将它们重构为某种设计模式。我正在考虑责任链复合,但是我在实际实现方面遇到了问题。有人可以建议如何重构这段代码吗?

最佳答案

您可以使用 Cor 模式来验证“行为”:每个 validator 都将实现一个基 ChainedValidator 接口(interface)(某些行为可以移动到父抽象类,因为它是所有链成员都相同):

    public class MyFirstValidator implements ChainedValidator{
//This CoR implementation has also a 'Composite' background
ChainedValidator nextValidator;

@Override
private void doValidate(Request request) throws ValidationException
{
if(badSituation){
//throw validation exception
}
}

@Override
public void doChainValidate(Request request) throws ValidationException
{//This method can be moved to a parent abstract class
doValidate(request);
if(nextValidator!=null){
nextValidator.doChainValidate(request);
}
}

private void attachValidator(ChainedValidator newValidator) throws ValidationException
{//same as previous method
if(nextValidator!=null){
nextValidator.attachValidator(request);
}else{
nextValidator=newValidator;
}
}
//setters & other methods
}

在您的 Controller /Web 层服务类上,您可以注入(inject)验证链的第一个 ChainedValidator 并调用 doChainValidate :

public class WebTierService{

ChainedValidator validator;

public Response serviceMethod(Request request){
try{
//...
validator.doChainValidate(request);
//...
}catch(ValidationException e){

return Response.status(400).entity(e.getMessage()).build();
}

}
}

正如您所看到的,逻辑是“流动的”(根据验证错误的类型,没有 if else 检查)并且添加新的 validator 相对简单(validator.attachValidator()),这使得逻辑可扩展且干净。

关于java - 如何重构 validator ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18986790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com