`
express_wind
  • 浏览: 29841 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

QLExpress脚本语言技术讲解(8)-------逻辑的处理

阅读更多

(注:相关代码请参考 com.ql.util.express.test.logic.ShortCircuitLogicTest类,

QLExpress 源代码下载地址:http://code.taobao.org/p/QLExpress/src/ )

 

昨天收到一份厂外人士的邮件,需求如下:

天樵,您好!
 
        网上看到你BLOG中开源出的QLExpress表达式,在实际的项目应用中有个问题请教你一下:
                   
        我们的项目想要使用QLExpress表达式来控制业务操作的可行性校验,通过表达式返回的true/false 确定业务操作是否被允许
        
        例如:
        用户.状态 =='有效' && (用户.网龄 > 2年 || 用户.类型=='VIP')
 
        但是要求结果除了true/false外,如果最终操作不被允许,还想得出具体不被允许的原因(哪一段、几段原子表达式导致了整体的结果为不通过);、、
 
        目前未在QL中看到类似功能,如果想要基于QLExpress来实现,希望你能向我们提供一些方向或者指导性的意见。

 

 

其实逻辑方面的控制大概在两年前我们就已经实现了,而且淘宝内部业务系统也多有在使用。物流宝,营销系统,监管系统等等。

 

隐含两个需求:

1、避免逻辑短路,因为要输出所有出错信息。

2、友好地显示出错信息。

 

解答:1

第一个问题很好解决:设置runner属性即可,这个设置在很多场景下还是很有用的(即想运行完所有的表达式,又想获取一个最后的结果)。

runner.setShortCircuit(true);

 

解答:2

 

ExpressRunner.addOperatorWithAlias(String keyWordName, String realKeyWordName,String errorInfo)

美其名曰:“操作符 重命名”,这个函数其实是专为逻辑判断出错信息的设计的。

 

例如我希望 (100 小于 99) 的时候报错,那我就可以重新定义下 “<”

runner.addOperatorWithAlias("小于","<","$1 小于 $2 不满足期望");

这样就会显示出错信息: 100小于99不满足期望

那有些大哥会苦恼了 ,我如果表达式内容就希望是  (100<99)而非 (100 小于 99)怎么办?

由于受限于ExpressRunner内部的操作符体系设计,我们只能妥协下,先做一个文字替换工作。

 

text = "100<99 and 100<=99 and 100>1";
text = text.replaceAll("<",“小于”).replaceAll("<=",“小于或等于”).replaceAll(">","大于");
runner.setShortCircuit(true);
runner.addOperatorWithAlias("小于","<","$1 小于 $2");
runner.addOperatorWithAlias("小于或等于","<=","$1 小于 $2");
runner.addOperatorWithAlias("大于",">","$1 小于 $2");

List<String> errorInfo = new ArrayList<String>();
IExpressContext<String,Object> expressContext = new DefaultContext<String,Object>();
runner.execute(text , expressContext, errorInfo, true, false);
if(result){
	System.out.println("result is success!");
}else{
	System.out.println("result is fail!");
	for(String error : errorInfo){
		error=error.replaceAll(“小于”,"<").replaceAll(“小于或等于”,"<=").replaceAll("大于",">");
		System.out.println(error);
	}
}

 

 

分享到:
评论
1 楼 yangbb 2018-02-28  
使用
runner.replaceOperator()或者runner.getOperatorFactory().getOperator(name).setErrorInfo(errorInfo)
如何?
String text = "100 < 99 and 100 <= 99 and 100 < 1 and 11 >  13";  
		ExpressRunner runner = new ExpressRunner(false,true);
		runner.setShortCircuit(false);
		runner.getOperatorFactory().getOperator("<").setErrorInfo("$1 大于或等于 $2");
		runner.getOperatorFactory().getOperator(">").setErrorInfo("$1 小于或等于 $2");
		runner.replaceOperator("<=", new OperatorEqualsLessMore("<=","<=","$1 大于 $2"));
		runner.replaceOperator(">=", new OperatorEqualsLessMore(">=",">=","$1 小于 $2"));  
		
		List<String> errorInfo = new ArrayList<String>();  
		IExpressContext<String,Object> expressContext = new DefaultContext<String,Object>();  
		boolean result = (Boolean)runner.execute(text , expressContext, errorInfo, true, true);  
		if(result){  
		    System.out.println("result is success!");  
		}else{  
		    System.out.println("result is fail!");  
		    for(String error : errorInfo){  
		    	System.out.println(error);
		    }  
		}

运行结果
result is fail!
 100  大于或等于  99 
 100  大于  99 
 100  大于或等于  1 
 11  小于或等于  13 


在runner单实例的情况下,replaceOperator可能会导致误替换带来其他表达式执行错误的风险,相比之下setErrorInfo带来的是展示错误提示信息方面风险

相关推荐

    脚本技术script56--2006(CHM)

    该书详细介绍了2006年时的脚本技术,涵盖多种脚本语言及其在IT领域的应用。CHM文件是一种常见于Windows平台的电子文档格式,它将HTML页面、图像和其他资源打包成单一的可执行文件,方便用户离线阅读和搜索。 在脚本...

    QLExpress:QLExpress是用于Java平台的功能强大,轻量级,动态的语言,旨在提高开发人员在不同业务场景中的工作效率

    QLExpress脚本引擎被广泛应用在阿里的电商业务场景,具有以下的一些特性: 1、线程安全,引擎运算过程中的产生的临时变量都是threadlocal类型。 2、高效执行,比较耗时的脚本编译过程可以缓存在本地机器,运行时的...

    BAT批处理脚本-清理-清除-垃圾-28个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    shell脚本语言使用简介---培训指南

    简单明了的shell脚本语言讲义,让你轻松了解shell语言。

    BAT批处理脚本-网络相关操作-44个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    BAT批处理脚本-提示窗口进度条-17个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    BAT批处理脚本-WinXP相关批处理-12个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    网络脚本语言-js作业-小网站源代码+报告

    这篇文档将深入探讨网络脚本语言JavaScript在构建小型网站中的应用,主要基于提供的"网络脚本语言-js作业-小网站源代码+报告"资源。JavaScript,通常简称为JS,是一种广泛用于网页和网络应用的解释型编程语言。它在...

    obs-文本-脚本 date-and-time.lua

    obs-文本-脚本 date-and-time.lua

    BAT批处理脚本-加密解密-22个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    BAT批处理脚本-数值计算-23个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    BAT批处理脚本-文本操作-52个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    BAT批处理脚本-系统设置查询修改-硬件相关-139个.zip

    BAT批处理脚本-WinXP相关批处理-12个 BAT批处理脚本-加密解密-22个 BAT批处理脚本-实用的批处理文件-70个 BAT批处理脚本-提示窗口进度条-17个 BAT批处理脚本-数值计算-23个 BAT批处理脚本-文件相关操作-92个 BAT...

    ide-eval-resetter idea重置试用期脚本

    idea 重置试用期脚本 ide-eval-resetter 1. 下载下来,解压 2. idea 点击试用并随便创建一个项目 3. 将ide-eval-resetter.zip压缩包直接拖进idea编辑器中

    游戏脚本-虚空掠夺者-卡兹克1.zip

    总之,这个压缩包“游戏脚本-虚空掠夺者-卡兹克1.zip”中包含了游戏开发的核心部分,即通过脚本语言构建的角色行为逻辑,它直接影响到玩家的游戏体验和角色的互动性。理解和掌握游戏脚本语言对于想要涉足游戏开发的...

    游戏脚本-猩红收割者-弗拉基米尔2.zip

    总的来说,"游戏脚本-猩红收割者-弗拉基米尔2.zip"包含的是游戏中的角色逻辑,通过对这个脚本的解析和修改,开发者可以丰富游戏内容,提升玩家体验。理解并掌握脚本语言对于游戏开发和调试至关重要,因为它让开发者...

    游戏脚本-虚空掠夺者-卡兹克3.zip

    总的来说,“游戏脚本-虚空掠夺者-卡兹克3.zip”这个压缩包揭示了游戏开发中的一个重要方面——通过脚本语言来实现游戏逻辑。通过解析和理解这些脚本,开发者能够了解到游戏如何通过代码来实现角色的动态行为,以及...

    游戏脚本-未来守护者-杰斯2.zip

    总结来说,"游戏脚本-未来守护者-杰斯2.zip"这个压缩包包含的是《未来守护者》游戏中关于杰斯角色的脚本文件,涉及到角色行为逻辑、技能系统、AI算法等多个方面。通过这些脚本,开发者可以精确控制角色的每一个细节...

    游戏脚本-放逐之刃-锐雯1.zip

    总之,"游戏脚本-放逐之刃-锐雯1.zip" 文件包含的是与游戏内角色锐雯相关的行为逻辑和控制代码,通过分析和修改这些脚本,开发者可以调整角色的性能、技能效果,甚至创建新的游戏体验。在游戏开发过程中,脚本的精细...

    brother_ql:适用于Brother QL系列标签打印机的光栅语言协议的Python软件包(QL-500,QL-550,QL-560,QL-570,QL-700,QL-710W,QL-720NW,QL-800,QL-810W ,QL-820NWB,QL-1050,QL-1060N等)

    使用/ dev / usb / lp0设备句柄) 声称支持以下打印机(✓表示经过作者或贡献者验证的打印机): QL-500(✓),QL-550(✓),QL-560(✓),QL-570(✓),QL-580N,QL-650TD,QL-700(✓),QL-710W(✓), QL-...

Global site tag (gtag.js) - Google Analytics