Drools业务规则管理系统25_问题引出1
一、问题引出
现有一个在线申请信用卡的业务场景,用户需要录入个人信息,如下图所示:
通过上图可以看到,用户录入的个人信息包括姓名、性别、年龄、学历、电话、所在公司、职位、月收入、是否有房、是否有车、是否有信用卡等。录入完成后点击申请按钮提交即可。
用户提交申请后,需要在系统的服务端进行用户信息合法性检查(是否有资格申请信用卡),只有通过合法性检查的用户才可以成功申请到信用卡(注意:不同用户有可能申请到的信用卡额度不同)。
检查用户信息合法性的规则如下:
用户信息合法性检查通过后,还需要根据如下信用卡发放规则确定用户所办信用卡的额度:
思考:如何实现上面的业务逻辑呢?
我们最容易想到的就是使用分支判断(if else)来实现,例如通过如下代码来检查用户信息合法性:
//此处为伪代码 //检查用户信息合法性,返回true表示检查通过,返回false表示检查不通过 public boolean checkUser(User user){ //如果申请人既没房也没车,同时学历为大专以下,并且月薪少于5000,那么不通过 if(user.getHouse() == null && user.getcar() == null && user.getEducation().equals("大专以下") && user.getSalary < 5000){ return false; } //如果申请人既没房也没车,同时学历为大专或本科,并且月薪少于3000,那么不通过 else if(user.getHouse() == null && user.getcar() == null && user.getEducation().equals("大专或本科") && user.getSalary < 3000){ return false; } //如果申请人既没房也没车,同时学历为本科以上,并且月薪少于2000,同时之前没有信用卡的,那么不通过 else if(user.getHouse() == null && user.getcar() == null && user.getEducation().equals("本科以上") && user.getSalary < 2000 && user.getHasCreditCard() == false){ return false; } //如果申请人现有的信用卡数量大于10,那么不通过 else if(user.getCreditCardCount() > 10){ return false; } return true; }
如果用户信息合法性检查通过后,还需要通过如下代码确定用户所办信用卡的额度:
//此处为伪代码 //根据用户输入信息确定信用卡额度 public Integer determineCreditCardLimit(User user){ //如果申请人有房有车,或者月收入在20000以上,那么发放的信用卡额度为15000 if((user.getHouse() != null && user.getcar() != null) || user.getSalary() > 20000){ return 15000; } //如果申请人没房没车,并且月收入在10000到20000之间,那么发放的信用卡额度为6000 else if(user.getHouse() == null && user.getcar() == null && user.getSalary() > 10000 && user.getSalary() < 20000){ return 6000; } //如果申请人没房没车,并且月收入在10000以下,那么发放的信用卡额度为3000 else if(user.getHouse() == null && user.getcar() == null && user.getSalary() < 10000){ return 3000; } //如果申请人有房没车或者没房但有车,并且月收入在10000以下,那么发放的信用卡额度为5000 else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null)) && user.getSalary() < 10000){ return 5000; } //如果申请人有房没车或者没房但有车,并且月收入在10000到20000之间,那么发放的信用卡额度为8000 else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null)) && (user.getSalary() > 10000 && user.getSalary() < 20000)){ return 8000; } }
通过上面的伪代码我们可以看到,我们的业务规则是通过Java代码的方式实现的。这种实现方式存在如下问题:
- 硬编码实现业务规则难以维护
- 硬编码实现业务规则难以应对变化
- 业务规则发生变化需要修改代码,重启服务后才能生效
那么面对上面的业务场景,还有什么好的实现方式吗?
答案是规则引擎。