什么是规则引擎
规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
举个例子:
在举行会员活动的时候有这样的需求,根据用户购买的商品价格和种类,赠送不同的积分。当商品价格小于100时,赠送20积分;当商品价格大于100小于500时,赠送80积分;当商品价格大于500时,赠送200积分。我们可以用if else语句实现对应的逻辑。
过了几天,运营部门决定修改活动规则,改为100-200赠送20,200-500赠送90,500-800赠送200……直到1w为止。此时我们可以通过结构体的方式来实现对应的功能。
BeginPrice int
EndPrice int
Points int
}
func RewardsV2(price int,rules []reWards Rule) int{
points :=0
for _, rule :=range rules{
if price >rule.BeginPrice &&price <rule.EndPrice{
points = rule.Points
}
}
return points
}
然后后面产品又脑洞大开了,觉得这个条件不够精细化,还要根据商品的标签属性,用户标签来判断。如果是新用户就乘二,如果商品是xx活动的特卖商品,积分就加多20。
若按照传统的开发模式,工作人员与代码的耦合度过高,每当规则需要改变的时候,就会需要较大的成本去修改代码。而规则引擎的出现可以让编码人员与代码解耦,使业务逻辑的变化对代码的影响降低
规则引擎编译原理
- 词法分析:将源代码中的字符串转换为词法单元
- 语法分析:分析由词法单元组成的语句并识别该语句的语法结构
抽象语法树
表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树一定是唯一确定的。抽象语法树采用递归向下算法,对于一个非终止符,会从左到右匹配产生式中的每一个项。
类型检查
验证执行的结果是否为合适的数据类型。在抽象语法树中,通常会验证某节点的子节点的数据类型是否合法