下面是其中一种方法中的代码。此外,许多方法中散布着类似的验证。
if (!isAgreeTermsAndConditions()) {
addException(Messages.AGREE_TERMS_AND_CONDITIONS);
} else {
if (!validationManager.isValidSsn(getSsn())) {
addException(Messages.INVALID_SSN);
}
if (!validationManager.isValidDate(getBirthYear()) {
addPropertyFormException(Messages.INVALID_DATE_OF_BIRTH);
}
}
}
作为重构的一部分,我提出了以下方法。基本上,将验证逻辑移动到枚举
class MyFormHandler{
public void submitOrder(){
MyFormHandlerWorker.SUBMIT_ORDER.validate(this);
}
public void addItemToCart(){
MyFormHandlerWorker.ADD_TO_CART.validate(this);
}
public void removeItemFromCart(){
MyFormHandlerWorker.REMOVE_FROM_CART.validate(this);
}
}
enum MyFormHandlerWorker{
SUBMIT_ORDER{
validate(MyFormHandler fh){
//perform validations
if (!fh.isAgreeTermsAndConditions()) {
fh.addException(Messages.AGREE_TERMS_AND_CONDITIONS);
} else {
if (!fh.getValidationManager().isValidSsn(fh.getSsn())) {
fh.addException(Messages.INVALID_SSN);
}
if (!fh.getValidationManager().isValidDate(fh.getBirthYear()) {
fh.addPropertyFormException(Messages.INVALID_DATE_OF_BIRTH);
}
}
}
}
};
public abstract void validate(MyFormHandler fh);
}
移动验证后,MyFormHandler
看起来更干净,但是对枚举与表单处理程序的反向依赖关系不满意。可以看出,枚举上的调用太多fh.method()
,这表明代码在表单处理程序中会更好。
有更好的方法来调整枚举或重构它吗?