决策表的本机Java解决方案

我正在与一位受人尊敬的同事讨论一个有趣的讨论,并希望得到一些额外的意见……

我需要在我的应用程序中实现一些基本的决策表逻辑。 我当时希望使用OpenL Tablets来代表Excel电子表格中的决策数据。 我喜欢它,它易于设置和维护,并且具有较小的内存和处理空间。 我可以轻松添加新表,我有一些表超过100行,最多10个条件。 这些数据非常静态,很少发生变化。

我的同事不希望在混合中引入第三方api,并对与Microsoft文件格式绑定有所保留。

我看到了他的观点,但我能看到通过Java实现决策表的唯一方法是编写一系列丑陋的if或case语句,这对于较小的表来说很好,但是当我到达更大的表时会变得无法管理。

有没有人对论点的双方都有任何评论。 如果有人对可以解决我在本机Java中的问题的模式有任何想法,我会有兴趣听到它。

非常感谢你的时间。

嗯,一个完全天真的尝试:

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

然后你会迭代:

 for ( Condition 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源代码相比,这将使您更灵活地更改规则。

您必须向这些解决方案中的任何一个添加另一个arrays才能获得100个源“行”

1)如果你的应用程序需要高性能,那么天真的方法很快就会在大型表上变慢。 例如,OpenL Tablets索引决策表在大多数情况下为任何表大小提供恒定的性能。

2)一旦你开始构建天真的方法,你会发现你需要实现不同类型的条件,不同类型的数据解析器等。

3)OpenL Tablets允许您在任何支持Java的平台上使用.xls文件,它只是一种存储格式,库本身就是纯Java。 最后,Excel文件是整个Universe中最容易转换/导出/导入的文件格式之一。

4)由于切换到最新的Apache POI库来解析xls和xlsx文件,OpenL Tablets运行时依赖性大小最近增长了。 现代标准仍然适度:)

关于MS Excel,它不是唯一可以创建Excel文件的软件Star / Open / LibreOffice也可以编辑它们。 并且像LTables所要求的决策表一样简单,不应该存在任何兼容性问题。

其他知名工具也使用excel作为决策表(请阅读JBoss Drools)