2011年4月2日星期六

你想知道a love b=?吗 --- QLExpress


在项目中时常需要涉及对表达式的处理,如:

  • "3.14 * 2.5 + 103/(24 + 13)" 的值
  • "aVar && (bVar || (cVar && dVar))" 的结果

甚至:

  • "1==2?50 +50:100+100"
  • "if 1==1 then return 100 else return 10;"
  • "a love b"
  • " for ... "

若实现以上要求QLExpress即可,QLExpressQuick Laconic Express 高效简洁脚本,淘宝玄难的一个开源的表达式项目,纯java实现。

我们不用再借助groovy也能实现复杂,带有简单逻辑的处理代码,可自定义操作符。

项目地址:http://code.taobao.org/project/view/294/

wiki非常详细,再有其他叙述就是多余(包括技术和使用)http://code.taobao.org/trac/QLExpress/wiki/ZhWikiStart

给出一个在项目中实际使用的例子。

需要判断一个用户是否具有某种符合的权限,如用户是否开通某中服务、是否打上某个标记、

是否附上某个权限code,这些权限还要进行与、或、非等逻辑运算、优先级控制如括号,如:


isService(userid) && ( hasTag("LP") || hasCode(256) ) #开通某个指定的服务, 并且具有"LP"标记或有256权限码。


代码截图如附件图:

这里的场景代码很简单,就是把表达式里的nameisService绑定到对象的方法isService上。

在以前如果我们实现这样的需求,一般把expression写成groovy语法脚本,再在java里调用执行。


如果有其他类似表达式的需要,可以试试QLExpress,能减少不少麻烦,代码里有大量的测试用例参考

没有评论: