2011-05-04 209 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)