这是我参与「第五届青训营 」伴学笔记创作活动的第 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定义