这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天。
这篇笔记旨在复习1月29日的实践课:规则引擎,这篇笔记仅会复习知识点,不会写实现的过程,课后作业:实现一个在线规则引擎将写在后续的笔记中。
一、规则引擎简述
首先,上课时老师举了个例子:在开发抖音商城的过程中,运营在不同时间前后提出了三个积分规则:
1、
| 商品价格 | 赠送积分 |
|---|---|
| <100 | 20 |
| <500 | 80 |
| >500 | 200 |
2、 根据价格区间(比如100-200,200-300)不断推进,每推进一次区间积分增加10,直到价格到1万封顶。如下表所示。
| 商品价格 | 赠送积分 |
|---|---|
| <100 | 20 |
| <200 | 30 |
| <300 | 40 |
| ... | ... |
| >=10000 | 1010 |
3、根据不同用户、不同商品、不同活动时间新增不同的积分赠送规则。
可以看到,前两个积分规则都可以非常简单实现,第一个积分规则用if-else语句即可实现;第二个积分规则用for循环即可实现;但到了第三个积分规则,又要推倒前两次的积分规则重写代码,维护起来十分麻烦,代码的可扩展性较弱,为了解决诸如此类的问题,引入了规则引擎。
规则引擎是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。规则引擎可以降低复杂业务逻辑组件复杂性,降低应用程序的维护成本,增加应用程序的可扩展性。
使用规则引擎,可以在业务人员修改规则决策时,使开发人员直接修改规则引擎的输入值,而不是重新写一遍代码,有效的解决开发人员重复编码的问题,使业务决策与服务本身解耦,提高服务的可维护性,缩短开发路径,提高效率。
规则引擎由数据输入、规则理解、规则执行组成。
二、规则引擎工作原理
1、词法分析
词法分析就是把源代码字符串转换为词法单元(Token)的过程。 比如:
price > 500 && (isNewUser || userLevel > 5)
可以拆分为词法单元:① price ② > ③ 500 ④ && ⑤( ⑥ isNewUser ⑦ || ⑧ userLevel ⑨ > ⑩ 5 ⑪ )
2、语法分析
语法分析就是在词法分析的基础上,识别表达式的语法结构的过程。语法分析可以将词法分析得到的词法单元作为二叉树的结点,语法结构用树来表示,生成抽象语法树。上述例子的抽象语法树如下图所示。
将抽象语法树进行后续遍历,即可得到原来的代码字符串表达式。
上下文无关语法
即语言句子无需考虑上下文,就可以判断正确性。可以用巴科斯范式(BNF)来表示。上下文无关语法由终结符集合T + 非终结符集合N + 产生式集合P + 起始符号S组成
终结符: 组成串的基本符号。可以理解为词法分析器产生的token集合。比如
+Id()等非终结符: 表示token的的集合的语法变量。比如
stmtvarDecl等等BNF本质上就是树形分解,分解成一棵抽象语法树
BNF形式如下: exp:log;
log:log('&&' | '||') cmp | cmp
cmp: cmp '>' add | add
add: add '+' mul | mul
mul: mul '*' pri | pri
pri: const | id | (exp)
递归下降算法
递归下降算法就是自顶向下构造语法树,不断对Token进行语法展开(下降),展开过程可能会遇到递归的情况。
实际上就是把Token按照BNF的格式自上而下进行对应,找到合适的位置并填入语法树中。
三、总结
以上就是对规则引擎的总结。