上一篇文章《QLExpress规则演进(二)给规则添加别名》我们介绍了规则的别名,但是这里面还有一个很重要的东西就是变量。那么什么是变量呢?下面是我们上一篇文章的规则:
如果 age 大于等于 18 并且 sex 等于 "男" 那么 "用戶已成年" 否则 "用户未成年"
在这个规则里面 age和sex就是变量,这些变量是动态值,也就是需要再规则引擎执行的时候传入的,如下:
DefaultContext<String, Object> context = new DefaultContext<String, Object>(); context.put("age", 17); context.put("sex", "男");
所有的规则引擎在执行的时候都有变量,这些变量可以是后面增加的(如上面的代码区),也可以使一开始就设置好的(如 1+2+3+4)。
思考一个问题,业务人员在配置规则的时候,这些变量他们知道是应该填写age还是sex吗?肯定是不知道的对吧?对于他们来说,那肯定是看年龄和性别这两个中文词更直观明了。所以这里在QLExpress中,对于中文的支持也是很丰富的,对于上面的规则,我们就可以写成:
如果 年龄 大于等于 18 并且 性别 等于 "男" 那么 "用戶已成年" 否则 "用户未成年"
这个规则是不是对于业务人员就很简单直观了?这里我们把规则和代码都修改一下:
package com.qlexpress.demo; import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; public class QLExpressDemo1 { public static void main(String[] args) throws Exception { // 这里我们定义整个的规则,也就是把上图的规则复制进来,实际开发中这种规则一般都存储在文件或者数据库里面。 String express = "如果 \r\n" + " 年龄 大于等于 18 并且 性别 等于 \"男\"\r\n" + "那么\r\n" + " \"用戶已成年\"\r\n" + "否则\r\n" + " \"用户未成年\" "; //创建一个expressRunner的实例 ExpressRunner runner = new ExpressRunner(); runner.addOperatorWithAlias("如果", "if", null); runner.addOperatorWithAlias("那么", "then", null); runner.addOperatorWithAlias("否则", "else", null); runner.addOperatorWithAlias("大于等于", ">=", null); runner.addOperatorWithAlias("并且", "&&", null); runner.addOperatorWithAlias("等于", "==", null); //这里模拟真实情况下传进来的变量 DefaultContext<String, Object> context = new DefaultContext<String, Object>(); context.put("年龄", 17); context.put("性别", "男"); //执行对应的规则 Object r = runner.execute(express, context, null, true, false); //输出规则执行的结果 System.out.println(r); } }
可以看到我们在传入常量的时候,也写了中文。然后我们运行一下:
执行结果没有任何问题。
备注:
1、这篇文章我们介绍的是常量,常量虽然也可以使中文,但是他和上一篇文章介绍的别名是不一样的,常量更像是一个占位符,当需要执行的时候,把占位符替换成真实的值即可。
2、这里我们可以思考下,在真实环境里面,变量肯定是传入的是user.age和user.sex,那么我们这里的context里面肯定是不会使用中文的对吧?业务人员肯定也不是操作英文的user.age和user.sex。那这种怎么解决呢?我们之前的方案做的是:对于变量会设置一个别名和key,这样子在页面上显示的是中文别名,然后保存的时候,把别名转换成对应的key,最后存储到数据库的是真实的程序代码,例如页面上看到和操作的都是如下的规则:
如果 年龄 大于等于 18 并且 性别 等于 "男" 那么 "用戶已成年" 否则 "用户未成年"
存储数据库的时候,前端会把别名映射为对应的key,如下:
如果 age 大于等于 18 并且 sex 等于 "男" 那么 "用戶已成年" 否则 "用户未成年"
此时对于运行的时候传入的就是age和sex了,就可以直接完整的执行了。
还没有评论,来说两句吧...