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

72 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天,今天学习了规则引擎设计与实现,偏高层的设计,还需要在实践里慢慢理解。

规则引擎设计与实现:

规则引擎:

       嵌入在应用中的组件,将业务决策从应用中抽离出来,并使用预定义的语义编写决策。接受数据输入,解释业务规则,做出决策。

       解决开发人员重复编码问题。

       业务决策与服务本身解耦,提高服务的可维护性。

       缩短开发路径,提高效率。

组成:

数据输入——接受策略集:

支持接受使用预定义的语义编写的规则作为策略集。比如“price > 500”接受业务的数据作为执行过程中的参数,比如价格、标签等

 

规则理解——预定义语义:

能够按照预先定义的词法、语法、优先级、运算符等正确理解业务规则所表达的义。

 

规则执行——类型检查:

根据执行时输入的参数对策略集中的规则进行正确的解释和执行。同时对规则执行过程中的数据类型进行检查,确保执行结果正确

 

应用场景:

风控对抗

活动运营

数据分析及数据清洗

6.2 编译原理:

词法分析:把源代码字符串转化为词法单元

语法分析:在词法分析的基础上,识别语法结构

基于抽象语法树

类型检查:

综合检查:

根据子表达式构造父表达式的类型

运行/编译时检查:

编译时提前声明

执行时根据传入的参数的类型,在执行过程中检查

 

6.3 设计一个规则引擎:

设计目标:

设计一个规则引擎,支持特定的词法、运算符、数据类型和优先级。并且支持基于以上预定义语法的规则表达式的编译和执行

 

项目结构:

├── README.md

├── compiler.go

├── compiler_test.go

├── compiler

│   ├── lexical.go

│   ├── parser.go   # 语法分析

│   ├── parser_test.go

│   ├── planner.go  # 构建语法树

│   ├── scanner.go  # 词法分析

│   └── scanner_test.go

├── executor

│   ├── ast.go      # 抽象语法树定义

│   ├── operator.go # 语法树执行

│   ├── svg.go      # 可视化打印语法树 - 辅助工具

│   ├── symbol.go   # 符号定义

│   ├── type.go     # 类型定义

│   └── type_checker.go # 类型检查

└── token

    ├── kind.go      # token类型

    ├── kind_test.go

    ├── lexer.go     # 词法定义

    └── token.go     # token定义