这条条件方法执行代码可以重构吗?

时间:2013-12-26 21:37:13

标签: design-patterns refactoring

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

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

因此它调用我的Object类中的各种检查方法,这些方法执行各种不同的验证,并使用可能不同的数据结构。现在有没有办法重构这个代码看起来更漂亮?这是一个糟糕的代码味道吗?

我认识到它是否以某些变量为条件你可以使用一些Map或Polymorphism来提取它们。但在这种情况下,这更像是一个try ... catch类型的逻辑,但如果我想稍后添加新的验证方法,代码看起来仍然很难看。有没有设计模式来重构这个?谢谢!

1 个答案:

答案 0 :(得分:3)

可能Chain of Responsibility链中的每个验证器都有自己的验证。如果它通过验证器步骤,则链中的下一个验证器将运行,依此类推。如果整个链通过,则对象通过验证。

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