您的位置  > 互联网

什么是规则引擎?如何实现“表达式的配置化”?

在介绍这个方案之前,我们首先要简单了解一下什么是规则引擎。

什么是规则引擎?

简单来说,规则引擎负责的就是判断某个对象或者对象是否满足某个条件,然后根据判断结果执行不同的动作。 例如:

对于刚在网站完成购物的用户(对象),如果她是“女性用户且(连续登录天数大于10天或订单金额大于200元)”(条件),那么系统会自动给用户发放一张()。

在上述场景中,规则引擎最重要的优点之一是“条件”表达式的配置。 如果无法配置条件表达式,那么程序员就需要在代码中编写各种if...else...。 如果条件组合特别复杂,代码会很难维护; 同时,如果无法配置,那么每次情况稍有变化,就需要修改代码,然后发布过程又要经过运维,无法快速响应业务需求。

在脚本方案中,上面的场景可以这样实现:

1)定义脚本:[代码]

def (参数){ 参数。 用户性别 == "女" && (args.连续登录天数 > 10 || args.订单金额 > 200);}

2)通过java提供的对象执行

组织..

3.0.7

/*

* @从数据库读取的表达式

*/

( ){

//实际使用时可以定义为单例

=新的();

= .();

地图args = new();

data.put("用户性别", "女");

data.put("连续登录天数", 11);

data.put("订单数量", 220);

.eval();

(() ).("", args);

上面的脚本中,经常需要改动的部分是表达式“args.用户性别==“女”&&(args.连续登录天数>10 || args.订单金额>200)”,即最简单的解决方案,就是在后台界面提供一个文本框,在文本框中输入整个脚本,然后保存到数据库中。 但这种方案有一个缺点:表达式的定义有一定的门槛。 对于程序员来说,这自然是一件很简单的事情,但是对于从来没有接触过编程的业务人员来说,就有一定的门槛,很容易输入错误的表达式。 这就引出了本文的另一个话题,如何实现bool表达式的可视化编辑?

如何实现bool表达式的可视化编辑?

一种解决方案是前端人员编写指定表达式的语法,然后将其渲染为界面。 业务人员编辑后,将界面元素结构转换为表达式。 然而,直接解析语法有两个确定性:

1)需要考虑的边界条件较多,一不小心可能会出现分析错误。

2)它还限制了后端可以使用的脚本语言。 例如,在上面的解决方案中,它使用的“AND”运算符是&&。 如果有一天有一种性能更好的脚本语言,它的“AND”运算符定位为and,那么它就需要修改。 许多地方解析表达式。

另一种解决方案是定义一个数据结构来描述表达式的结构(说了这么多,终于进入正题了):

{ “全部”: [

{ “任何”: [

{ "gl": ["连续登录天数", 10] },

{ "gl": ["订单数量", 200] }

]},

{ "eq": ["用户性别", "女"] }

]}

然后,递归地解析该结构。 对于前端开发来说,可以在递归解析过程中渲染成对应的界面元素; 对于后端人员来说,可以生成相应的bool表达式。 通过 bool 表达式,您可以使用预先确定的脚本模板生成最终规则。

// 模板示例

def (args){ $s;}

/**

* 动态布尔表达式解析器

*/

班级 {

最终Map = new();

最终=新();

{

.put("全部", "&&");

.put("任何", "||");

.put("ge", ">=");

.put("gt", ">");

.put("eq", "==");

.put("ne", "!=");

.put("乐", "