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 に答える
0

MS Excelについては、Star / Open/LibreOfficeでExcelファイルを作成できるソフトウェアはこれだけではありません。また、LTablesが必要とするデシジョンテーブルと同じくらい単純なので、互換性の問題はありません。

また、他のよく知られたツールはデシジョンテーブルにExcelを使用します(JBoss Droolsと読んでください)

于 2012-01-26T16:48:49.347 に答える