首页 > 代码库 > 规则引擎设计概况

规则引擎设计概况

在一个系统中业务规则占据了相当大的比例,而且是变动最为频繁的,我们总是希望把容易变动的和不容易变动的分离开来,这样就不至于因为修改易变的部分影响不需变的部分,从而简化系统修改的复杂性,也提高系统的灵活性。

 

在一个系统中我们把组成部分拆分为数据,逻辑,界面等几个部分,其中数据又可以进一步拆分为水平和垂直部分,对于逻辑绝大部分是”如果-那么”这种形式,对于界面部分可拆分为页面,控件(文本框,下拉框,日期,文件,图片,单选框,多选框等)和展示权限(可看,可编辑)。

 

业务逻辑从本质上来讲就是一种规则的集合,数据和展示都是规则实施的对象,规则甚至也可以对规则起作用,这样就成了规则的规则。因此如果要设计规则引擎那么这个规则必须要可以引用和操作数据(水平,垂直),页面,控件,规则等组成部分。

 

上面也提到规则大部分是“如果-那么”这种形式,这种形式从本质上讲可以看做“条件-执行”,这样所有的规则都拆分为规则条件和规则执行体两部分。规则有作用域,顺序,黑名单,白名单,例外等。

 

对于规则的形式我想到了几个简单的例子:

  1. 当客户生日时产品折扣为0.8

rule "1":

if

 [Customer].[Birthday]=[Today]

then

 [Product].[Rate]=0.8

else

 [Product].[Rate]=1

end

  1. 在2013-11-01到2013-11-10期间产品货号73022101折扣0.8

rule "2":

if

 [Today]>=[2013-11-01] and [Today]<=[2013-11-10] and [Product].[sCode]=73022101

then

 [Product].[Rate]=0.8

else

 [Product].[Rate]=1

  1. 操作员级别为3的执行规则1,其他的执行规则2

rule "3":

If

         [Operator].[level]=3

Then

         [Rule “1”].Active=true

         [Rule “2”].Active=false

Else

         [Rule “1”].Active=false

         [Rule “2”].Active=true

End

  1. 员工类型为采购时入库价可见,其他用户不可见

rule "4":

If

         [Operator].[type]=”采购”

Then

         [Product].[Price_in]. Visible=true

Else

         [Product].[Price_in]. Visible=false

End

 

以上规则是在配置文件中的,可方便修改而不用修改程序和进行编译,也可以缓存起来以提高性能。

 

规则的表现形式可以是xml,脚本,逻辑语言,图像,如果能实现一个规则设计器可以大大方便规则的制定,降低规则学习的门槛。

 

因为要保证规则的全局性,那么对所有的数据查询,修改都要经过这个规则校验,因此数据操作需要一个集中的入口或者出口,所有对数据的操作都要有个用户id,规则引擎根据id和规则库来校验操作的合法性。

 

因为要保证界面权限和模型权限的一致性,因此要开发一套可以根据权限来自动展现的控件库。

 

引入规则引擎对开发模式影响也是很大的,由于业务规则从系统中分离出来,数据的基本操作都可以变成简单的增删改,有利于程序自动统一处理。开发的重点变成了开发规则执行的规则,简单的说就是制定规则的规则。系统初始化后只有一个设计器,通过设计器建立行业模型,再通过设计器对模型进行规则限制,这些工作将转移到实施部门进行,不需要开发部门进行干预。由于建立一套行业规则的工作量是很大的,因此可以预置几套行业规则模板,同一套系统在不同的规则下来适应不同的行业业务。

 

改造后的系统最终变成 “原型系统+规则=行业软件”,当然此想法很初步和不成熟,建立一套这样的系统难度和初期工作量也很大,但是一旦建立起来后系统灵活性大大提高,后期随业务变更变的容易,变更成本更低,更具市场竞争力。

规则引擎设计概况