简而言之,我想知道编码用户定义标准的标准方法是什么(例如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不是问题,但我不确定:
存储用户条件的位置(在db表中,在XML中等等)?
如果布尔/比较运算符以及布尔语句的结构(即嵌套语句)不是硬编码的话,如何设置commRate变量
如果我实际上没有在实际代码中使用布尔/比较运算符,我很难实现这个目标,但我知道这是可能的。我知道你可以使用二叉树数据结构来处理数学公式,但我不确定我是否在正确的轨道上。
我很感激任何建议。
由于
答案 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的同一个人构建的;所以你应该仔细研究一下。