2016-12-07 118 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相關聯。