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();
}
}
//都过去了
返回“有效”;
}