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 条件格式一样)

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

另外,请注意上面的例子非常简单。现实生活中的计算将涉及一个更复杂的公式,该公式将大多数布尔/比较运算符与嵌套语句一起使用。如果不满足任何条件,几乎总会出现“其他”情况。最后,这将应用于每一行都是一个相当大的记录集。

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

  1. 在哪里存储用户的条件(在 db 表中、在 XML 中等...)?

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

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

我会很感激任何建议。

谢谢

4

2 回答 2

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

这是一个人为的示例,但可以让您了解它是如何工作的。如果您有许多不同的规则,则临时库可能更适合。

于 2013-02-21T21:17:43.273 回答
0

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

于 2013-02-21T21:18:26.677 回答