1. 程式人生 > >Drools規則引擎-如果Fact物件引數為null如何處理

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%e