这种流氓规则可以写得更简单吗?

时间:2016-12-07 09:39:33

标签: drools

我刚开始编写drools规则,并想出了这个:

rule "Premium to high."
when
    PricingResponse($netPremium : this.getTotalNetPremium(),
                    $paymentTerm : this.getPaymentTerm().getMonths());
    $newPremium : BigDecimal() from $netPremium.multiply($paymentTerm);
    $currentPremium : BigDecimal();
    BigDecimal($newPremium.divide($currentPremium, MathContext.DECIMAL128) > 1.2B);
then
    insert(new Validation("New premium " + $newPremium + " (" + $netPremium +
           " * " + $paymentTerm + ") " + 
           " is larger than 120% of the current premium " +
           $currentPremium, Department.K_EN_A));
end

上面的流氓规则正在起作用。然而,对于我正在解决的问题,LHS似乎有点复杂,所以我的问题是它可以写​​得更简单吗?如果是这样,怎么样?

PricingResponse中插入了BigDecimalKieSession个对象。触发规则后,将检索所有Validation个对象。我认为这是一个相当标准的规则问题在PricingResponse对象中,有一个BigDecimal totalNetPremium属性和一个&#39; PaymentTerm paymentTerm&#39;属性。我想验证paymentTerm和totalNetPremium的乘积是否大于原始溢价的120%,它是作为BigDecimal插入的。 PaymentTerm班级为enum,且BigDecimal month属性为<{1}}。

1 个答案:

答案 0 :(得分:1)

规则确实不必要地复杂,主要是因为您认为必须将所有BigDecimal个对象提取为模式。这是我的第一个提议:

rule "Premium to high."
when
  PricingResponse($netPrem: totalNetPremium,
                  $paymtTerm: paymentTerm)
  $currPrem: BigDecimal();
  eval( isTooHigh( $netPrem, $paymtTerm.getMonths(), $currPrem ) )
then

除了通过仅使用字段名称省略分号和.this.get...()之外,我已将笨拙的BigDecimal操作提取到函数中,该函数可以实现为DRL函数或作为静态Java函数导入。

我不喜欢使用“原始”JDK类作为事实(这里:BigDecimal)。这些对象没有区别。此值应来自包含的类,例如Policy,而后者应该与PricingResponse相关联。