Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 这个条件方法执行的代码可以重构吗?_Design Patterns_Refactoring - Fatal编程技术网

Design patterns 这个条件方法执行的代码可以重构吗?

Design patterns 这个条件方法执行的代码可以重构吗?,design-patterns,refactoring,Design Patterns,Refactoring,如果我有某种方法可以执行以下操作: public String validate(Object input) { if(input.isTimeInvalid()){ return "timeInvalid"; } if(input.isChecksumInvalid()){ return "checksumInvalid"; } if(input.isSignatureInvalid()){ return

如果我有某种方法可以执行以下操作:

public String validate(Object input) {
    if(input.isTimeInvalid()){
        return "timeInvalid";
    }
    if(input.isChecksumInvalid()){
        return "checksumInvalid";
    }
    if(input.isSignatureInvalid()){
        return "signatureInvalid"
    }
    if(input.isSolutionInvalid()){
        return "solutionInvalid"
    }
    return "valid";
 }
因此,它在我的对象类中调用各种检查方法,这些方法执行各种不同的验证,并可能使用不同的数据结构。现在有没有办法重构这段代码使其看起来更漂亮?这是一种糟糕的代码气味吗


我知道如果它是以某个变量为条件的,你可能会使用一些映射或多态性来提取它们。但在本例中,这更像是一种try…catch类型的逻辑,但如果我以后想添加新的验证方法,代码看起来仍然很难看。有没有一种设计模式可以重构这个?谢谢

可能
责任链
链中的每个验证器都进行自己的验证。如果它通过了验证器步骤,那么链中的下一个验证器将运行next,以此类推。如果整个链通过验证,则对象通过验证

interface Validator{
    //throws Exception with error message explaining what failed.
    void validate(Object input) throws ValidationException;
 }


 ....
 private List<Validator> validators;

 public String validate(Object input) {

    for(Validator validator : validators){
          //this is a very ugly try-catch to return String
          //to preserve the original signature of OP
         try{
            validator.validate(input);
         }catch(ValidationException e){
             //failed
             return e.getMessage();
          }

    }
      //all passed
    return "valid";
 }
接口验证程序{
//引发异常,并显示解释失败原因的错误消息。
void validate(对象输入)抛出ValidationException;
}
....
私有列表验证程序;
公共字符串验证(对象输入){
for(验证器验证器:验证器){
//这是一个非常难看的尝试捕捉返回字符串
//保留OP的原始签名
试一试{
validator.validate(输入);
}捕获(ValidationException e){
//失败
返回e.getMessage();
}
}
//都过去了
返回“有效”;
}