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

212 阅读3分钟

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

规则引擎是什么

所谓规则引擎,其实就是一个嵌入到应用程序中的组件,接受数据输入,使用预定义的语义模板来编写业务。有了规则引擎,业务人员就可以直接的修改规则决策了,解决了开发重复编码问题,提高了可维护性。

组成:

  1. 数据输入:支持接受使用预定义的语义编写的规则作为策略集
  2. 规则理解:理解业务规则所表达的语义
  3. 规则执行:根据执行时输入的参数来解释和执行并检查策略集

应用场景:

风控对抗、活动策略运营、数据分析和清洗

编译原理基本概念

规则引擎编译原理——>理解

词法分析: 将源代码字符串转为Token(词法单元)的过程。

语法分析: 在词法分析的基础上,识别表达式的语法结构(如:左操作数,右操作数,操作符)。

规则引擎编译原理——>执行

抽象语法树:

我们在数据结构中学习过树,其实表达式的语法结构也可以用树来表示,这个树的每一个结点(子树)代表语法单元,这个单元的构成规则叫语法。通俗点说这个树就是将源代码字符串按照其结构来转化成树。比如prize>500&&(isNewUser||userLevel>5)的抽象语法树为:

image.png

递归下降算法:

自顶向下构造语法树。在不断对Token进行展开时,可能会遇到递归的情况。

规则引擎编译原理——>输入输出

类型检查: 类型检查可以发生在表达式编译阶段(构造语法树的阶段),也可以发生在执行阶段

如何设计一个规则引擎

  • 确定词法(Token):包括参数、数据类型和运算符,确定好优先级。
  • 语法分析:分析出优先级的表达、分析语法树结构。

语法树结构分析方法:

一元运算符:左子树为空,右子树为右操作数。

二元运算符:左子树为左操作数,右子树为右操作数。

括号:左子树为空,右子树为内部表达式的AST。

  • 语法树执行:后续遍历来执行。

先执行左子树,再执行右子树,最后根据结点的操作符执行得到根节点的值。

  • 类型检查:校验左右结点的类型

'>'符号要求左右结点的值都存在并且为int或float;

'!'符号要求左节点为空且右结点为bool

总结

了解了规则引擎的设计与实现,重点内容是抽象语法树的结构,学过数据结构中的树,相信对于这部分内容会很容易理解的。本人第一次接触规则引擎,如文中有错误,还请大家帮忙指出!感谢阅读!