2016-12-07 114 views
0

我刚开始写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 

Drools的排除上述工作。然而,LHS对于我正在解决的问题似乎有点复杂,所以我的问题是它可以写​​得更简单吗?如果是这样,怎么样?

PricingResponseBigDecimal对象插入到KieSession中。在规则被解雇后,所有Validation对象被检索。我认为是一个非常标准的规则问题。在PricingResponse对象中有一个BigDecimal totalNetPremium属性和一个'PaymentTerm paymentTerm'属性。我想验证paymentTerm和totalNetPremium的乘积是否大于原始保费的120%,插入为BigDecimalPaymentTerm类是enum,它具有BigDecimal month属性。

回答

1

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

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相关联。