实践课-规则引擎 | 青训营笔记

22 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 6 天

1. 认识规则引擎

从一个例子来认识规则引擎

=> 现在有一个电商活动:满足相应消费金额就可以获得积分,具体活动数额如下:

image.png

他的相应实现代码如下:

image.png

=> 如果奖励规则改变为:

  • 100-200:送20

  • 200-500:送90

  • 500-800:送100

    以此类推到消费金额为10000

如果这时候再用if...else语句,可能就会很麻烦了,估计会写很多行if...else,这个时候我们考虑使用结构体数组与函数来封装实现功能。

image.png

=> 但是后来规则又变了

面对规则的一变再变,我们如果对于不同规则设计一套代码,可能会非常不便于开发,于是就有了规则引擎

image.png

Conclusion

Old Develop Logic: Change rules -> change code/design new algorithm -> finish (low-effeciency)

New Develop Logic: Change rules -> push rules into Engine -> finish (high-effeciency)

规则引擎的组成部分

image.png

2. 编译原理

讲规则引擎的组成部分的实现之前,要先了解编译原理

规则引擎的本质:我们自己定义一套语法,然后去解析用这套语法写的表达式,然后根据解析的内容执行表达式。这个过程其实就是编译和执行的过程。

Part 1:理解

词法分析

把源代码字符串转换为词法单元(Token)的过程

image.png

(图片:转换为Token举例)

如何识别Token?这里就要用到有限自动只因(Finite-State Automation)

image.png

语法分析

在词法分析的基础上,识别出表达式的语法结构

image.png

Part 2:执行

抽象语法树

表达式抽象语法结构的树状表示,对于一个表达式,抽象语法树一定时唯一确定的

image.png

image.png

Part 3:输入输出

类型检查

验证执行的结果是否为合适的数据类型。在抽象的语法树中,通常会验证某节点的数据类型是否合法。

image.png

参数注入

在规则执行的过程中,使用输入的参数值来计算语法树中的标识符节点值的过程。

3. 规则引擎应用场景

image.png