乐趣区

Drools规则引擎如果Fact对象参数为null如何处理

问题场景

在技术交流群(QQ:715840230)中有同学提出这样的问题:

往 kiesession 里面传入 fact,如果不做输入检查 fact 里面有些字段可能是 null 值。但是如果在外面做输入检查,规则一改,fact 所需要的字段不一样了,输入检查也要跟着改,耦合比较强。有没有比较好的方法呢?

问题解答

其实针对这种问题与规则引擎的关系不大,比较重要的还是要看业务逻辑。

比如对一个企业进行信用评级,涉及三个维度:企业年龄、企业注册资本与企业法人年龄。当然,在这个例子中各项值暂定为都是越高所得的评定分值越高。

就这个例子来解答一下上面的问题。从两个维度来讲:

减少耦合

如果想真正的减少耦合,那么可将三个维度的进行拆分,不放在一个 fact 对象中传入,而是三个规则,每个规则都计算对应的值,最终将结果逐个相加。使用这种方案,便不存在 fact 值为 null 的问题。

增加判断

如果是将三个业务的判断放在一个规则当中,那么对 fact 对象为 null 的情况就需要特殊处理了。比如在 when 中我们只获取类型为企业的 fact 对象,而不具体限定条件。这样只要是企业对象进入,都会被规则匹配,而具体的分值计算放在 then 部分进行处理。

还有一种情况就是限定条件通过自定义一些函数来进行处理,比如获得 fact 对象之后将通过自定义的函数将其处理成预期的结果,然后再在 then 中做汇总。

其他方法

那么,针对那位同学的问题,他想通过在插入 fact 对象之前进行校验排查,这其实是一种选择,选择默认属性为 null 的值的得分为 0。针对他的这项疑惑,本人在交流群中给出的解答为:

不传这个值或忽略这个值,其实就是对这个值的一种处理。同样的,在规则中也可以这样处理,而且更灵活的处理。比如这个打分,如果某一项不传,那默认可能这一项就是 0 分,但如果传了 null 值,你可以在规则中对 null 进行处理,设置为 0,你甚至还可以对 null 值进行处理,设置成负数。

相关技术视频

CSDN 学院:《Drools7 规则引擎进阶教程》

CSDN 学院:《Drools7 规则引擎入门教程》

CSDN 学院:《Drools7 系列优惠套餐》

原文链接:http://www.choupangxia.com/20…

退出移动版