2012-12-14 41 views
0

在編寫drools規則時,我是否將檢查分爲更多規則或將它們全部集中在一個規則中以在'then'部分中包含更多if?不考慮任何管理問題,只考慮性能(例如執行時間,內存usuage)。假設我有多個任務,他們的條件和要做的事情是90%相似,只剩下10%是針對他們每個人的。你寫單獨的流口水治療還是有更多的後果?

rule A 
when (90% conditions) and (task 1 or task 2 or task n) 
then 
    if (10% conditions for task 1) ...(10% stuff-to-do for task 1) 
    else if (10% conditions for task 2) ...(10% stuff-to-do for task 2) 
    else if (10% conditions for task n) ...(10% stuff-to-do for task n) 
    (90% common stuff-to-do) 
end 

rule B-1 
when (90% conditions) and (10% conditions for task 1) 
then 
    (90% common stuff-to-do) + (10% stuff-to-do for task 1) 
end 
rule B-2 
when (90% conditions) and (10% conditions for task 2) 
then 
    (90% common stuff-to-do) + (10% stuff-to-do for task 2) 
end 
rule B-n 
when (90% conditions) and (10% conditions for task n) 
then 
    (90% common stuff-to-do) + (10% stuff-to-do for task n) 
end 

謝謝!

回答

1

而不是將條件和任務組合在一起,您需要將它們分成單獨的規則,如下例所示。執行時間並不重要,這要歸功於RETE和內存使用情況主要取決於您的事實,而不是規則。

通過將條件邏輯分離爲單獨的規則,您將獲得可測試和可管理的代碼庫。將所有東西放入一個大規則與在普通的java代碼中使用if-else語句並沒有多大區別,在這種情況下,Drools只會增加項目的複雜性而沒有任何好處。

rule 90_1 
when 
    //first rule for common stuff 
then 
    // 
end 


rule 90_2 
when 
    //second rule for common stuff 
then 
    // 
end 


rule 90_N 
when 
    //last rule for common stuff 
then 
    // 
end 

rule A_1 
when 
    //first rule for A 
then 
    // 
end 


rule A_2 
when 
    //second rule for a 
then 
    // 
end 

rule B 
when 
    //rule for B 
then 
    // 
end 
+0

因此,我從你那裏得知,小細節規則在Drools中更好,謝謝:) – user1589188

+0

需要考慮的另外一件事是,如果你發現你的代碼庫混雜着許多類似的規則,那麼值得考慮一下簡單的DSL或創建決策表。 – Steve

3

我不是Rete引擎的專家,但一般規則是,只要決策在規則的左側,引擎就能夠優化其Rete樹以確保可以達成決定最高效。所以它應該更有效地保持LHS的一切。應該像瘟疫一樣避免LHS中的'eval'相同的原因。

當然,除了微優化規則之外,如果每個這樣的決策都是在一個單獨的規則中聲明的,那麼編寫單元測試很簡單,它會評估在不同情況下是否激活了正確的規則。如果你合併規則,那麼你不再能夠測試你的規則是否在他們應該的時候觸發。

+0

對,這些都對我有意義,謝謝! – user1589188

2

我更喜歡第二個。有單獨的小規則很乾淨。 由於Drools的目的是將您的IF-ELSE更改爲規則

+0

好點! – user1589188