我有一些规则来验证我的模型类MyBean。现在,ifs链只在一个方法(validateMyBean)中完成。我不喜欢这样,看起来很模糊。
验证许多商业规则的最佳方法是什么?
public class MyBean {
private int id;
private String email;
private int age;
private String country;
private double otherField;
//getter and setter
}
public class MyBeanFacade {
//database connection and other methods
}
public class MyBeanBusiness {
private MyBeanFacade facade;
private MyBean myBean;
public boolean validateMyBean() {
if(!this.myBean.getEmail().contains("@") {
return false;
}
if(this.myBean.getAge()<18 || this.myBean.getAge()>150) {
return false;
}
if(this.myBean.getCountry().startsWith("A") || this.myBean.getCountry().startsWith("B") || this.myBean.getCountry().startsWith("C") || ) {
return false;
}
if(this.myBean.getOtherField() >= 0.123) {
return false;
}
if(facade.existsEmail(myBean.getEmail())) {
return false;
}
return true;
}
}
答案 0 :(得分:1)
将验证逻辑放入setter方法中,以防止设置无效值。抛出异常以拒绝给定值。这消除了对验证方法的需要,并保证验证代码将针对每个设定值运行。
更好的是,通过获取构造函数中的值来消除setter,以保证执行所有验证。如果一个构造函数的参数太多,请使用Builder pattern。
答案 1 :(得分:0)
您可以在Specification pattern之后创建业务规则独立类。这样您就可以对每个规则进行单元测试。
对于返回Predicate
值的规则,实现Java的Predicate
接口是很自然的。然后,and
规则可以与逻辑运算符or
和START_STICKY
结合使用。它们也很适合Java 8的函数式编程模型。
有关规范模式的示例,请参阅here。