这是我参与「第五届青训营」伴学笔记创作活动的第6天。
前言
这节课是目前学过的课程里,我需要花精力最多的一节,我在以前的学习和实习过程中从来没有听过“规则引擎”这个东西,以及这节课看目录还需要编译原理作为前置知识,我是计科专业的,没有学过编译原理。因此,对我是一个挑战,在记录这篇笔记的同时,也在看编译原理的相关知识。
知识点内容
1.初识规则引擎
首先,让我们看下对于规则引擎的定义:规则引擎是一种嵌入在应用服务中的组件,可以将灵活多变的业务决策从服务代码中分离出来。通过使用预定义的语义模块来编写业务逻辑规则。在执行时接受数据输入、解释业务规则,并做出决策。规则引擎能大大提高系统的灵活性和扩展性。
乍一看好像和我们使用if-else的判断逻辑或者策略模式一样,主要是对业务规则进行判断和处理。但无论是哪一种都是我们作为开发者这个角色去做的事情,如果是那种存在比较复杂的业务规则而且需要经常变动的业务系统,就需要开发者经常去维护原有代码,非常不方便;而规则引擎则是将代码与业务进行解耦,在需要变动业务规则的情况下,不再需要开发者去维护代码,业务人员自己就可以去维护。
举一些应用场景的实例有助于我们更好得去理解它的应用,比如电商系统-满减、打折;风控系统-风险贷款、风险评估;决策系统-财务计算等。
执行过程示意图如下:
2.规则引擎的设计
对于规则引擎,主要是针对我们的业务进行服务。因此简单来说的话,规则引擎的设计主要分为以下两种:①判断类型-根据不同条件处理不同的逻辑;②:赋值类型-为某个元素赋予默认值。
3.编译原理
规则引擎为什么会和编译原理产生交集呢?因为规则引擎的本质呢就是我们自己定义一套语法,然后去解析用这套语法写的表达式,然后根据解析的内容执行表达式。这个过程其实就是编译和执行的过程。
3.1-什么是编译
编译就是把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序(目标语言程序)
如果源代码编译后要在操作系统上运行,那目标代码就是汇编/机器代码;如果编译后是在虚拟机里执行,那目标代码就可以不是汇编代码,而是一种解释器可以理解的中间形式的代码即可。
而我的“母语”-Java是半编译型,它的源代码会先通过Javac编译成字节码,再通过虚拟机将字节码转换成机器码。
3.2-编译步骤
这里只做大概介绍,详细内容查看编译原理的相关书籍或者文末的参考文档。
3.2.1-词法分析
把源代码字符串分解为有意义的代码块的这个过程,这些代码块统称为词法单元(token)。
3.2.2-语法分析
词法分析是识别一个个的单词,而语法分析就是在词法分析的基础上识别出程序的语法结构。这个结构是一个树状结构。这棵树叫做抽象语法树(Abstract Syntax Tree,AST)。树的每个节点(子树)是一个语法单元,这个单元的构成规则就叫“语法”。
3.2.3-抽象语法树
抽象语法树是源代码的抽象语法结构的树状表示,树上的每个节点都表示源代码中的一种结构,之所以说是抽象的,抽象表示把js代码进行了结构化的转化,转化为一种数据结构。这种数据结构其实就是一个大的json对象,json我们都熟悉,他就像一棵枝繁叶茂的树。有树根,有树干,有树枝,有树叶,无论多小多大,都是一棵完整的树。
简单理解的话,就是把我们写的代码按照一定的规则转换成一种树形结构。
3.2.4-类型检查
类型检查主要是为了判断变量或者参数的实际类型和声明的类型是否匹配的问题。通常我们遇到这个问题的时候,是语义分析阶段的静态类型检查。这个类型检查可以让我们及早的发现类型不匹配的问题,不用等到执行的时候才发现这个问题。提前发现问题,降低问题成本。
4.测试截图
自定义规则的接口运行测试:
小结
通过今天的学习,我认为规则引擎这个东西是不错的。它可以很好地适配部分场景下的复杂业务规则进行变动,而且将业务规则与代码解耦,后期业务规则发生变动将不再需要开发人员去维护代码,业务人员自己就可以维护。如果我以后在工作中遇到类似场景,就可以考虑这个技术,毕竟Java目前也有比较成熟的规则引擎,今天算是开眼界了,知道了一个自己还没接触过的技术,还顺便学习了一部分编译原理的知识,一定程度上弥补了自己的不足!