如果我有某种方法可以执行以下操作:
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类型的逻辑,但如果我想稍后添加新的验证方法,代码看起来仍然很难看。有没有设计模式来重构这个?谢谢!
答案 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";
}