zoukankan      html  css  js  c++  java
  • 规则引擎设计概况

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

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

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

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

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

    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和规则库来校验操作的合法性。

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

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

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

                                                                                                                                                朱现国 2014-04-24

  • 相关阅读:
    ES6学习笔记(七)-对象扩展
    ES6学习笔记(四)-数值扩展
    ES6学习笔记(三)-正则扩展
    ES6学习笔记(二)-字符串的扩展
    ES6学习笔记(一)-变量的解构赋值
    webpack打包踩坑之TypeError: Cannot read property 'bindings' of null
    CSS之Flex 布局
    iscsi
    DHCP
    DNS
  • 原文地址:https://www.cnblogs.com/zhuxianguo/p/5972310.html
Copyright © 2011-2022 走看看