2013-02-21 69 views
0

一言以蔽之的,我看了就知道了标准方法是什么编码的用户定义的标准(如Excel的条件格式)用户逻辑而不是硬编码的逻辑(如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; 
} 

所以,在这个例子中,用于确定佣金率的逻辑是硬编码的。但是,我想从硬编码中取出这个逻辑,并允许用户使用布尔和比较运算符对db中的字段添加,修改和删除这些条件(同样,就像Excel条件格式化一样)

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

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

设计这个图形用户界面是没有问题的,但我不能确定:

  1. 在哪里存储用户的条件(在数据库表中的XML,等等)?

  2. 如何设置commRate变量如果布尔/比较操作符堪与布尔语句的结构本身(即嵌套的语句)没有硬编码

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

我会很感激任何建议。

感谢

+1

这是在[业务规则引擎](http://en.wikipedia.org/wiki/Business_rules_engine)中处理的。一个Java解决方案在JBoss drools中解释[here](http://stackoverflow.com/q/776901/1065197)。 – 2013-02-21 21:15:04

回答

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

这是一个人为的例子,但给你它的工作原理。如果你有许多不同的规则,一个专门的库可能更适合。

+0

由于OP说实际问题比他的帖子更复杂,所以很难判断这个解决方案对他的实际应用来说是否很麻烦。也许,每次都会改变整个规则。 – kasavbere 2013-02-21 21:21:47

+0

@ kasavbere同意 - 这取决于他的使用情况。但考虑到安装的良好性能和简单性,可能值得一看。加上良好的面向对象原则可以使它成为一个优雅的解 – assylias 2013-02-21 21:23:47

+0

@kasavbere你的答案和这一个唯一的问题是OP的要求:*允许用户添加,修改和删除这些标准使用布尔和比较运算符对数据库中的字段(再次,就像Excel条件格式)*。这是由BRMS处理的,而Drools是一个处理这种工作的Java开源工具(更多信息请参阅我对OP问题的评论)。 – 2013-02-21 21:26:27

0

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