规则引擎的设计和实现|青训营笔记

86 阅读2分钟

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

规则引擎的组成部分和应用场景

规则引擎: 是一种嵌入在应用程序中的组件,实现业务决策从代码中分离出来,并使用预定义的语句模块编写业务决策,接受数据输入,解释业务规则,并根据业务规则做出业务决策。

优点: 解决开发人员重复编码问题;提高服务的可维护性,缩短开发路径,提高效率。

使用了规则引擎后,业务人员可以直接通过修改规则引擎来实现业务逻辑,不需要通过开发人员间接实现。

组成部分: 数据输入、规则理解(预定于语句)、规则执行。

应用场景: 风控对抗、活动策略运营、数据分析和清洗。

核心原理——编译原理的基本概念

编译原则: 理解(语法分析、词法分析)、执行(抽象语法树)、输入输出。

词法分析: 把源代码字符串转换为词法单元的这个过程

有限自动机:有n个状态,输入字符,都能做一个确定的状态转换

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

抽象语法树: 每一个节点就是一个词法单元

上下文无关语法:

r:=a>b

语句与上下文无关,可以使用巴克斯范式来表达

exp:log;
log:log('&&'|'||')cmp|cmp
cmp:cmp'>'add|add
add:add'+'mul|mul
mul:mul'*'pri|pri
pri:const|id|(exp)

递归下降算法: 自顶向下构造语法树

例:price>500 && (isNewUser||userLevel>5)

先找price,从最开始找一只递归找到pri(id),然后回溯找>的位置,找到cmp,之后从cmp递归找到pri(con),一个语法单元就是这样的,类似往下找。

类型检查

  • 类型综合:根据子表达式构建父表达式类型
  • 编译时检查&运行时检查:发生在表达式的编译阶段

设计一个规则引擎

设计目标: 支持特定的语法、运算符、数据类型和优先级,并且支持基于以上预定于语法的规则表达式的编译和执行

语法树执行:预定定义好每一种操作符的执行逻辑,对抽象语法树进行后续遍历执行

实现一个规则引擎

根据库里面的内容自己动手跑一下。