Elw*_*ood 7 java rules decision-tree
我正在与一位受人尊敬的同事讨论一个有趣的讨论,并希望得到一些额外的意见......
我需要在我的应用程序中实现一些基本的决策表逻辑.我当时希望使用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;
});
Run Code Online (Sandbox Code Playgroud)
然后你会迭代:
for ( Condition<YourObject> cond : row ) {
if ( ! cond.process(yourobj) ) break;
}
Run Code Online (Sandbox Code Playgroud)
一个稍微复杂的例子,您可以更简洁地在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");
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
与重新编译Java源代码相比,这将使您更灵活地更改规则.
您必须向这些解决方案中的任何一个添加另一个阵列才能获得100个源"行"