2011-05-04 89 views
6

我haiving與尊敬的同事一個有趣的討論,並希望一些額外的輸入...機Java解決決策表

我需要實現我的應用程序的一些基本決策表邏輯。我正在使用代表Excel電子表格中決策數據的OpenL Tablets。我喜歡它,它很容易設置和維護,並且具有較小的內存和處理空間。我可以很容易地添加新表格,並且我有一些超過100行和多達10個條件的表格。這些數據非常靜態,很少發生變化。

我的同事不希望引入第三方API混進去,並具有約被捆綁到微軟的文件格式保留。

我明白了他的觀點,但通過Java實現決策表的唯一方法是編寫一系列醜陋的if或case語句,這對於較小的表格來說很好,但當我到達更大的桌子。

有誰對爭論的雙方任何評論。如果任何人有任何的想法,因爲到可能解決原生Java我的問題的模式我很想聽到它。

非常感謝您的時間。

回答

8

嗯,完全天真的嘗試:

public interface Condition<Type T> { 
    public boolean process(T object); 
} 

ArrayList row = new ArrayList<Condition>(10); 
row.add(new Condition<YourObject>() { 
       public boolean process(YourObject obj) { 
         if (obj.property > 0) return true; 
         else return false; 
       }); 
row.add(new Condition<YourObject>() { 
       public boolean process(YourObject obj) { 
         if (obj.property2 == 100) return true; 
         else return false; 
       }); 

,那麼你會遍歷:

for (Condition<YourObject> cond : row) { 
    if (! cond.process(yourobj)) break; 
} 

一個稍微複雜的例子,你可以寫你的決定表中的javascript很多更簡潔,也許使用Beanshell來執行邏輯。在我可以發佈你的例子之前,我將不得不擊中一下這個外殼。

,或者它可能的,如果你發佈了一個例子有人能想出一些簡單的Scala程序做你想要什麼。

編輯:

所以我做了一些研究和思考,併爲您的BeanShell可以使用像這樣:

import bsh.Interpreter; 

Interpreter i = new Interpreter(); // Construct an interpreter 
YourObject yourObject = new YourObject(); 
i.set("myObject", yourObject); 

// Source an external script file 
i.source("somefile.bsh"); 

而且somefile.bsh可能是這樣的:

var rules = new Array(); 
rules.push(function(var) { 
      if (var.getProperty() == 0) return true; 
      else return false; 
      }); 
rules.push(function(var) { 
      if (var.getProperty() < 1000) return true; 
      else return false; 
      }); 
... more rules ... 

for (var func in rules) { 
    if (!func(myObject)) break; 
} 

這會給你更多的靈活性來改變規則,而不是重新編譯Java源代碼。

你將不得不另一個陣列添加到這些解決方案,讓您的100源「行」

+1

哇,謝謝克里斯。我認爲我可以用這個做點什麼...我會給它一個旋轉。 – Elwood 2011-05-04 21:12:01

4

1)如果你的應用需要高性能,天真的方法將很快在大表變得緩慢。例如,在大多數情況下,OpenL Tablets爲索引決策表提供任何表大小的恆定性能。

2)一旦你開始建立在天真的方法之上,你會發現你需要實現不同類型的條件,對不同類型的數據等解析器

3)去除隱藏片可以讓你用任何支持Java的平臺.xls文件,它只是一個存儲格式,庫本身是純Java的。最後,Excel文件是整個Universe中最容易轉換/導出/導入的文件格式之一。

4)由於切換到最新的Apache POI庫來解析xls和xlsx文件,OpenL Tablets運行時依賴關係的大小最近有所增加。它仍然是現代標準謙虛:)

+1

非常感謝。我很樂意報告我贏得了我的同事。該產品的演示和上述要點的解釋完成了這個訣竅。我不是重新發明輪子的大愛好者,而且OpenL Tablet能夠完美地滿足我的需求。 – Elwood 2011-05-16 20:19:06

0

關於MS Excel,它不是唯一的軟件,可以創建Excel文件Star/Open/LibreOffice也可以編輯它們。和LTables所要求的決策表一樣簡單,不應該有任何兼容性問題。

其他衆所周知的工具使用Excel的決策表(閱讀它的JBoss Drools)