【问题标题】:User Logic Instead of Hardcoded Logic (like Excel Conditional Formatting)用户逻辑而不是硬编码逻辑(如 Excel 条件格式)
【发布时间】:2013-02-21 21:10:26
【问题描述】:

简而言之,我想知道用于编码用户定义标准(例如 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 变量

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

如果有任何建议,我将不胜感激。

谢谢

【问题讨论】:

标签: java algorithm data-structures


【解决方案1】:

假设您有以下形式的规则,取自 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 库可能更适合。

【讨论】:

  • 由于 OP 说实际问题比他的帖子更复杂,很难判断这个解决方案是否会影响他的实际应用。也许,规则的整体每次都会改变。
  • @kasavbere 同意 - 这取决于他的用例。但考虑到良好的性能和安装的简单性,它可​​能值得一看。加上好的 OO 原则可以使它成为一个优雅的解决方案。
  • @kasavbere 你的答案中唯一的问题,这是 OP 的要求:允许用户使用布尔和比较运算符对数据库中的字段添加、修改和删除这些标准(再次,就像 Excel 条件格式一样)。这是由 BRMS 处理的,而 Drools 是一个处理此类工作的 Java 开源工具(更多信息在我对 OP 问题的评论中的链接中)。
  • @LuiggiMendoza 我同意如果 OP 需要高级功能,这会很麻烦。
  • @LuiggiMendoza, kasavbere 谢谢你们的建议。 Drools 看起来很有趣,所以我会调查一下。谢谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多