Java 枚举作为验证程序
下面是其中一个方法中的代码。此外,在许多方法中都有类似的验证Java 枚举作为验证程序,java,validation,enums,Java,Validation,Enums,下面是其中一个方法中的代码。此外,在许多方法中都有类似的验证 if (!isAgreeTermsAndConditions()) { addException(Messages.AGREE_TERMS_AND_CONDITIONS); } else { if (!validationManager.isValidSsn(getSsn())) { addException(Messages.INVALID_SSN); } if (!
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()
调用,这表明在表单处理程序中使用代码会更好
有没有更好的方法来调整枚举或重构它?是否有许多操作,每个操作都使用许多验证,但组合方式不同,并且都遵循类似的if-logic模式?是的,有许多操作,每个操作都有自己的if-else-if-else验证模式,为什么要拆分代码?当然,表单知道如何验证自身。另一方面,在设计使用哪种验证器之前,您必须知道它是什么样的形式,这与拥有枚举的大部分目的背道而驰。为什么不将s validate()方法添加到表单中呢?表单处理程序有大约3000行代码,其中验证分散在整个表单中。表单中有许多validate()方法,代码看起来很混乱。我希望将Validation移动到单独的组件,但是由于验证的结果只是表单(.addExceptions)上的操作,因此表单处理程序本身似乎是处理这些验证的最佳位置。也许一个封装这些验证的内部类是个好主意?我的意思是,您应该为FormHandler创建一个抽象基类,并为覆盖validate方法的每个特定表单创建一个子类。如果您必须计算出从请求中的信息中使用的表单处理程序(例如,所有表单使用相同的URL),请考虑“工厂方法”模式。