上一篇文章《QLExpress规则演进(四)自定义功能》我们介绍了自定义功能,这篇文章我们再把项目演进一下,用宏来实现。宏是在生产环境中使用最多的,所有的功能模块都可以抽象为宏。
说到宏,大家可能一脸懵,这个比较抽象,其实宏就是可以把一连串的动作串联起来,然后起一个名,这个就是宏。
下面我们挨个来演示一下,还是使用上一节的规则:
如果 年龄 大于等于 18 那么 输出("用戶已成年") 否则 输出("用户未成年")
一、把判断条件抽象为宏
这里的话,我们的判断条件:年龄 大于等于 18 并且 性别 等于 "男" 这个就是一个动作,我们可以把他抽象为宏,那么组成的方式就是
宏 | 动作 |
计算成年年龄 | 年龄 大于等于 18 |
二、把输出内容抽象为宏
上面的规则我们有两个输出,每一个输出我们都可以抽象为宏,那么组成的方式就是
宏 | 动作 |
输出成年 | 输出(\"成年\"\r\n) |
addMacro | 输出(\"未成年\"\r\n) |
三、对于宏的判断逻辑,抽象为宏
上面我们已经定义了两个宏,此时我们调用宏判断规则这也是一系列的动作,也可以抽象为宏,那么组成的方式就是
宏 | 动作 |
判断成年 | if(计算成年年龄) then 输出成年 else 输出未成年 |
此时我们就把宏抽象完了,那么在执行的时候,我们只需要执行某一个宏就是了(这个取决于要什么结果,如果要最终结果,那么就要执行最顶级的宏,如果要某个小部分的结果,则对应执行对应小部分的宏即可)
四、下面演示下最终的代码
package com.qlexpress.demo; import com.ql.util.express.DefaultContext; import com.ql.util.express.ExpressRunner; public class QLExpressDemo { public static void main(String[] args) throws Exception { ExpressRunner runner = new ExpressRunner(); runner.addOperatorWithAlias("大于等于", ">=", null); runner.addFunctionOfClassMethod("输出", QLExpressDemo.class.getName(), "outPrint", new String[] { "String" }, null); runner.addMacro("计算成年年龄", "年龄 大于等于 18"); runner.addMacro("输出成年", "输出(\"成年\"\r\n)"); runner.addMacro("输出未成年", "输出(\"未成年\"\r\n)"); runner.addMacro("判断成年", "if(计算成年年龄) then 输出成年 else 输出未成年"); DefaultContext<String, Object> context = new DefaultContext<String, Object>(); context.put("年龄", 18); Object r = runner.execute("判断成年", context, null, true, false); System.out.println(r); } public String outPrint(String str) { System.out.println("方法受到参数: "+str); return str; } }
然后执行一下,看结果
这里对于宏的操作就完成了。
备注:
1、在真实环境中我们几乎全是用宏来操作所有的信息。
2、宏取名的时候,这里只能是字符串,不要直接使用32位的md5值,因为在qlexpress框架中,如果直接用md5的话,他在解析的时候,碰到以数字开头的md5字符串他就会用int去解析,框架就会抛出异常。
还没有评论,来说两句吧...