决策表的本机Java解决方案

| 我正在与一位尊敬的同事进行有趣的讨论,并希望提供一些补充信息... 我需要在我的应用程序中实现一些基本的决策表逻辑。我一直在使用OpenL Tablets,它代表Excel电子表格中的决策数据。我喜欢它,它易于设置和维护,并且具有较小的内存和处理空间。我可以轻松地添加新表,并且有些表的行数超过100,最多10个条件。此数据是静态的,很少更改。 我的同事不想在混合中引入第三方api,并且对绑定到Microsoft文件格式有所保留。 我明白他的观点,但是我能看到的通过Java实现决策表的唯一方法是编写一系列难看的if或case语句,这对于较小的表是好的,但是当我到达较大的表时将变得难以管理。 任何人在论点的两边都没有意见。如果有人对可以解决本机Java问题的模式有任何想法,我很想听听它。 非常感谢您的宝贵时间。     
已邀请:
嗯,一个完全天真的尝试:
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)如果您的应用需要高性能,那么幼稚的方法很快就会在大型表上变慢。例如,在大多数情况下,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)     

要回复问题请先登录注册