以下是其中一种方法中的代码。此外,许多方法都有类似的验证。
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()
次调用,这表明代码在表单处理程序中会更好。
任何更好的方法来调整枚举或重构这个?