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/2019/07/26/drools%e8%a7%84%e5%88%99%e5%bc%95%e6%93%8e-%e5%a6%82%e6%9e%9cfact%e5%af%b9%e8%b1%a1%e5%8f%82%e6%95%b0%e4%b8%banull%e5%a6%82%e4%bd%95%e5%a4%84%e7%90%86/

你可能感兴趣的:(Drools规则引擎-如果Fact对象参数为null如何处理)