用户逻辑而不是硬编码逻辑(如Excel条件格式)

时间:2013-02-21 21:10:26

标签: java algorithm data-structures

简而言之,我想知道编码用户定义标准的标准方法是什么(例如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条件格式)

注意我以变量的设置为例。相反,我可以根据标准调用另一个程序?

另外,请注意上面的例子非常简单。现实生活中的计算将涉及一个更复杂的公式,它使用大多数布尔/比较运算符和嵌套语句。几乎总会有一个&#34; else&#34;如果没有满足条件的情况。最后,这将应用于每一行是一个相当大的记录集。

为此设计GUI不是问题,但我不确定:

  1. 存储用户条件的位置(在db表中,在XML中等等)?

  2. 如果布尔/比较运算符以及布尔语句的结构(即嵌套语句)不是硬编码的话,如何设置commRate变量

  3. 如果我实际上没有在实际代码中使用布尔/比较运算符,我很难实现这个目标,但我知道这是可能的。我知道你可以使用二叉树数据结构来处理数学公式,但我不确定我是否在正确的轨道上。

    我很感激任何建议。

    由于

2 个答案:

答案 0 :(得分:0)

假设您拥有以下表格中的规则,取自GUI或您的数据库或文件(等):

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;
    }
}

这是一个人为的例子,但可以让您了解它的工作原理。如果您有许多不同的规则,ad-hoc库可能更适合。

答案 1 :(得分:0)

从技术上讲,java没有将函数或部分函数作为参数的方法。如果你知道如何使用scala,你可以将scala结合到java中。它可能比购买一些规则引擎便宜很多.BTW,scala是由构建java的同一个人构建的;所以你应该仔细研究一下。