【问题标题】:Native Java Solution to Decision Table决策表的原生 Java 解决方案
【发布时间】:2011-08-18 20:58:12
【问题描述】:

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

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

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

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

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

非常感谢您的宝贵时间。

【问题讨论】:

    标签: java rules decision-tree


    【解决方案1】:

    嗯,一个完全幼稚的尝试:

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

    【讨论】:

    • 哇,谢谢克里斯。我想我可以用这个做点什么......我会试一试。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 非常感谢。我很高兴地报告说我赢得了我的同事的支持。产品的演示和对上述要点的解释起到了作用。我不喜欢重新发明轮子,而 openL 平板电脑可以完美地满足我的需求。
    【解决方案3】:

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

    其他众所周知的工具也使用 excel 来制作决策表(请阅读 JBoss Drools)

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 2010-09-25
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      相关资源
      最近更新 更多