验证业务规则

时间:2015-07-22 15:24:29

标签: java design-patterns jsf-2.2 business-rules

我有一些规则来验证我的模型类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;
    }
}

2 个答案:

答案 0 :(得分:1)

将验证逻辑放入setter方法中,以防止设置无效值。抛出异常以拒绝给定值。这消除了对验证方法的需要,并保证验证代码将针对每个设定值运行。

更好的是,通过获取构造函数中的值来消除setter,以保证执行所有验证。如果一个构造函数的参数太多,请使用Builder pattern

答案 1 :(得分:0)

您可以在Specification pattern之后创建业务规则独立类。这样您就可以对每个规则进行单元测试。

对于返回Predicate值的规则,实现Java的Predicate接口是很自然的。然后,and规则可以与逻辑运算符orSTART_STICKY结合使用。它们也很适合Java 8的函数式编程模型。

有关规范模式的示例,请参阅here