【问题标题】:Can this drools rule be written simpler?这个流口水规则可以写得更简单吗?
【发布时间】:2016-12-07 09:39:33
【问题描述】:

我刚开始写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 似乎有点复杂,所以我的问题是它可以写​​得更简单吗?如果有,怎么做?

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

【问题讨论】:

    标签: drools


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 2011-03-23
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多