7

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

我需要在我的应用程序中实现一些基本的决策表逻辑。我正在寻找使用在 Excel 电子表格中表示决策数据的 OpenL 平板电脑。我喜欢它,它易于设置和维护,并且内存和处理占用空间小。我可以轻松地添加新表,并且我有一些超过 100 行和多达 10 个条件的表。这些数据是相当静态的,很少改变。

我的同事不想在混合中引入第三方 api,并且对绑定到 Microsoft 文件格式持保留意见。

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

有没有人对争论的双方有任何意见。如果有人对可以在本机 Java 中解决我的问题的模式有任何想法,我很想听听。

非常感谢您的时间。

4

3 回答 3

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 个源“行”

于 2011-05-04T21:04:23.363 回答
4

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

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

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

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

于 2011-05-11T02:33:16.463 回答
0

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

其他众所周知的工具也将 excel 用于决策表(阅读 JBoss Drools)

于 2012-01-26T16:48:49.347 回答