0

一言で言えば、ユーザー定義の基準 (Excel の条件付き書式設定など) をコーディングするための標準的な方法論が何であるかを知りたいと思っています。

たとえば、次のコードの手数料システムがあるとします。

if (sales < 100 && empCategory = "junior") {
   commRate = 0.50;
} else if (sales < 100 && empCategory = "senior") { 
   commRate = 0.60;
} else if (sales >= 100 && sales <1000) { 
   commRate = 0.70;
} else {
   commRate = 0.80;
}

したがって、この例では、手数料率を決定するロジックがハードコーディングされています。ただし、ハードコードされたコードからこのロジックを取り除き、ユーザーがデータベース内のフィールドに対してブール演算子と比較演算子を使用してこれらの基準を追加、変更、および削除できるようにしたいと考えています (これも、Excel の条件付き書式設定と同様です)。

例として変数の設定を使用していることに注意してください。代わりに、基準に基づいて別の手順を呼び出すことができますか?

また、上記の例は非常に単純化されていることに注意してください。実際の計算には、ネストされたステートメントでブール/比較演算子のほとんどを使用する、はるかに複雑な式が含まれます。条件が満たされない場合、ほとんどの場合、"else" ケースが存在します。最後に、これは各行に適用されますが、かなり大きなレコードセットです。

このための GUI を設計することは問題ではありませんが、確信が持てません:

  1. ユーザーの条件をどこに保存するか (db テーブル、XML など)?

  2. ブール/比較演算子、および実際にはブール ステートメント (つまり、ネストされたステートメント) の構造そのものがハードコードされていない場合に、commRate 変数を設定する方法

実際のコードでブール/比較演算子を実際に使用していない場合、これを達成する方法に困惑していますが、それが可能であることはわかっています。二分木データ構造を使用して数式を操作できることは知っていますが、正しい軌道に乗っているかどうかはわかりません。

アドバイスをいただければ幸いです。

ありがとう

4

2 に答える 2

0

技術的には、Java には、関数または部分関数をパラメーターとして受け取るメソッドはありません。scala の使用方法を知っている場合は、scala を Java に組み合わせることができます。おそらく、いくつかのルールエンジンなどを購入するよりもはるかに安価です。ところで、scala は Java を構築したのと同じ人々によって構築されました。だからあなたは本当にそれを調べる必要があります。

于 2013-02-21T21:18:26.677 に答える
0

GUIまたはDBまたはファイル(など)から取得した次の形式のルールがあると仮定します。

condition1 = sales < 100 && empCategory == "Junior"
outcome1 = 0.50

その後、実行時にScriptEngineを使用してそれらを評価できます。

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

public class Test {

    public static void main(String[] args) throws Exception {
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");

        //actual value of the parameter
        double sales = 90;
        String empCategory = "Junior";

        //pass the actual values to the engine
        engine.eval("sales = " + sales);
        engine.eval("empCategory = " + empCategory);

        //get the rules from the DB / GUI
        String condition1Str = "sales < 100 && empCategory == \"Junior\"";
        double outcome1 = 0.50;

        //check the actual value vs. the rules
        Boolean condition1 = (Boolean) engine.eval(condition1Str);

        //rest of your logic here
        if (condition1) commRate = outcome1;
    }
}

これは不自然な例ですが、どのように機能するかのアイデアを提供します。多くの異なるルールがある場合は、アドホック ライブラリが適している可能性があります。

于 2013-02-21T21:17:43.273 に答える