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

105 阅读3分钟

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

(还没写完,先发一下w

今天的作业是实现一个在线规则引擎,咕咕如我之前一直没做过课后作业,那今天就尝试做一下叭orz

我的作业项目代码放在这里了:

btw 在最开头放一下我的学习时间,以供参考:

总计

  • 看文档:1h

  • 看网课:

  • 写博客:

1. 项目要求

使用Hertz框架开发一个HTTP服务,服务使用mysql,支持表达式的增删查改和编译执行。 并实现以下接口:

  • 直接表达式执行
  • 新增表达式
  • 查询表达式
  • 删除表达式

具体接口文档见:【后端专场 学习资料三】第五届字节跳动青训营

2. 前置知识学习

很好,我没学过编译原理;

很好,hertz小项目咕咕了没做;

很好,规则引擎是啥听都没听过;

...

但是我想学!(燃起来了bushi

小猫🐱和小狗🐶的故事

拿人话说:规则引擎实现业务决策和应用程序代码的解耦 这好像也不太像人话...

举个🌰,规则引擎就像是一个翻译软件,业务说的是小猫话(一些规则的决策),没有翻译软件的时候,开发需要充当翻译人员,把业务的小猫话翻译成小狗话(产出能实现业务逻辑的代码);有了翻译软件,业务的小猫话直接输入翻译软件就能自动生成小狗话,不需要开发人员来翻译,开发只需要负责这个翻译软件,也就是规则引擎的开发

规则引擎vs编译器

看到这里,我不禁用仅有的一点知识储备感慨:规则引擎和编译器就莫名的像啊!

主要分为三个部分:

  • 理解:词法分析 + 语法分析
  • 执行:抽象语法树
  • 输入输出:参数注入 + 类型检查

理解

  • 词法分析:基于有限状态机遍历整个表达式,输出一系列Token(词法单元)给下一阶段

  • 语法分析:指在词法分析的基础上识别表达式的语法结构的过程;表达式的语法结构可以用树来表示,叫抽象语法树

    • 上下文无关语法:无需考虑上下文,用BNF(巴科斯范式来表达

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

执行

  • 类型检查
    • 类型综合:根据子表达式的类型构造出父表达式的类型
    • 编译时检查 && 运行时检查:类型检查可以发生在表达式的编译阶段,即构造语法树阶段;也可以发生在执行时的阶段

3. 实现思路

  1. 设计词法分析状态机

4. 在线规则引擎的具体实现

5. 更多优化的地方

6. 最后,对于学习方法的思考

这篇博客就到这里啦,如果你觉得看完我的博客有所收获的话,那我或许还算做出了一点微小的贡献w我的实现还存在很多不完善的地方,希望各位大佬可以在评论区多多留言讨论 || 提issue,欢迎来互fo~