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系列優惠套餐》