2013-02-21 68 views
0

一言以蔽之的,我看了就知道了標準方法是什麼編碼的用戶定義的標準(如Excel的條件格式)用戶邏輯而不是硬編碼的邏輯(如Excel條件格式)

例如,讓我們說我有用下面的代碼佣金系統:

if (sales < 100 && empCategory = "junior") { 
    commRate = 0.50; 
} else if (sales < 100 && empCategory = "senior") { 
    commRate = 0.60; 
} else if (sales >= 100 && sales <1000) { 
    commRate = 0.70; 
} else { 
    commRate = 0.80; 
} 

所以,在這個例子中,用於確定佣金率的邏輯是硬編碼的。但是,我想從硬編碼中取出這個邏輯,並允許用戶使用布爾和比較運算符對db中的字段添加,修改和刪除這些條件(同樣,就像Excel條件格式化一樣)

注意I以變​​量的設置爲例。相反,我可以根據標準調用另一個過程?

另外請注意,上面的例子非常簡單。現實生活中的計算會涉及一個更復雜的公式,該公式將大多數布爾/比較運算符與嵌套語句結合使用。如果沒有條件滿足,幾乎總是會有一個「其他」情況。最後,這將應用於每一行是一個相當大的記錄集。

設計這個圖形用戶界面是沒有問題的,但我不能確定:

  1. 在哪裏存儲用戶的條件(在數據庫表中的XML,等等)?

  2. 如何設置commRate變量如果布爾/比較操作符堪與布爾語句的結構本身(即嵌套的語句)沒有硬編碼

我難倒如何實現這一目標如果我在實際代碼中實際上沒有使用布爾/比較運算符,但我知道這是可能的。我知道你可以使用二叉樹數據結構來處理數學公式,但我不確定我是否在正確的軌道上。

我會很感激任何建議。

感謝

+1

這是在[業務規則引擎](http://en.wikipedia.org/wiki/Business_rules_engine)中處理的。一個Java解決方案在JBoss drools中解釋[here](http://stackoverflow.com/q/776901/1065197)。 – 2013-02-21 21:15:04

回答

0

假設你有以下形式的規則,從GUI或您的數據庫或文件(等)採取:

condition1 = sales < 100 && empCategory == "Junior" 
outcome1 = 0.50 

然後,您可以在運行時用ScriptEngine對其進行評估:

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 

public class Test { 

    public static void main(String[] args) throws Exception { 
     ScriptEngineManager factory = new ScriptEngineManager(); 
     ScriptEngine engine = factory.getEngineByName("JavaScript"); 

     //actual value of the parameter 
     double sales = 90; 
     String empCategory = "Junior"; 

     //pass the actual values to the engine 
     engine.eval("sales = " + sales); 
     engine.eval("empCategory = " + empCategory); 

     //get the rules from the DB/GUI 
     String condition1Str = "sales < 100 && empCategory == \"Junior\""; 
     double outcome1 = 0.50; 

     //check the actual value vs. the rules 
     Boolean condition1 = (Boolean) engine.eval(condition1Str); 

     //rest of your logic here 
     if (condition1) commRate = outcome1; 
    } 
} 

這是一個人爲的例子,但給你它的工作原理。如果你有許多不同的規則,一個專門的庫可能更適合。

+0

由於OP說實際問題比他的帖子更復雜,所以很難判斷這個解決方案對他的實際應用來說是否很麻煩。也許,每次都會改變整個規則。 – kasavbere 2013-02-21 21:21:47

+0

@ kasavbere同意 - 這取決於他的使用情況。但考慮到安裝的良好性能和簡單性,可能值得一看。加上良好的面向對象原則可以使它成爲一個優雅的解 – assylias 2013-02-21 21:23:47

+0

@kasavbere你的答案和這一個唯一的問題是OP的要求:*允許用戶添加,修改和刪除這些標準使用布爾和比較運算符對數據庫中的字段(再次,就像Excel條件格式)*。這是由BRMS處理的,而Drools是一個處理這種工作的Java開源工具(更多信息請參閱我對OP問題的評論)。 – 2013-02-21 21:26:27

0

從技術上講,java沒有將函數或部分函數作爲參數的方法。如果你知道如何使用scala,你可以將scala結合到java中。它可能比購買一些規則引擎便宜很多,等等。順便說一下,scala是由建立java的相同人員構建的;所以你應該仔細研究一下。