业务程序与规则引擎之间使用业务对象模型BOM做接口,这要求传入和传出的对象属性都必须是固定的,如参数个数和类型是固定的,如工资系统中,就要求工资项是固定的,如实发工资、基本工资、平时加班小时、周末加班小时、高温津贴、请假小时、旷工小时等,但实际的应用中,客户公司可能根据不同情况而增加更多的工资项,只有最基本的几项可能是固定的。如工厂中可能增加气味和粉尘津贴,而普通的公司就没有这个工资项目。这样会导致工资系统开发者无所适从,直接的影响是,起码在客户编辑工资公式时没办法直接使用新增的工资项。这就是BOM的可变参数问题。

    数据式与字段式取值
    目前对于可变参数,一般的解决方法是将可变的内容全部放入列表类型的对象中,典型的类型就是数组。使用可变数组就可以保存任意的数据。如果用数组保存起来,那就是数据,不是字段了,数据式取值时,使用的语法是Get("参数名"),而使用字段式取值时,则直接用参数名。两个操作方式的不同,对于程序员来说没什么感觉,但对于普通用户来说,则很不相同了,普通用户可能不理解Get("")的语法,他们最多可以理解的形式就是Excel的A1,B2取单元格形式。   


    如前面提到的特殊津贴,在合计津贴时,使用的设置方法为Set("合计津贴",Get("高温津贴") +Get("气味津贴")  + Get("粉尘津贴")),这样的表达方式有明显的问题,1,格式难以记忆,对于普通的业务人员,很难理解公式的意思和书写方法。2,参数名容易书写错误难以发现,因为参数的错误而导致公式的错误,后果不堪设想。
    而使用字段形式,就这样书写:合计津贴=高温津贴+气味津贴+粉尘津贴,书写方法非常简单和理。
   

    如何由数据转为字段

    数据变为字段,可以大大提高编辑公式的可读性,也直接减少了书写错误,变成字段之后,一旦出现拼写错误,公式不允许提交和保存,这是ckrule原来就有的功能了,由数据转字段可以有2种不同的形式,1,只在规则编辑器中转换,2,整个规则包来转换。
    


    在客户规则池定义中,可以用Get方法和Set方法控制取值和设值,从而实现规则编辑器中直接使用自定义参数的功能,如在关键字选项卡中新增气味津贴,然后Get方法设置为return Get("气味津贴"); 而Set方法设置为Set("气味津贴",value);,如此,规则编辑器的使用过程中,就可以把气味津贴变成了字段。这种设置方法的局限性就是只能在规则编辑器中生效,而且要为每一个“新字段”设置一次。
    而使用整个规则包来转换,则更为合适,具体做法是,使用两个规则包来解决,即主规则包和辅助规则包,主规则包只用于接收数据,所有接收的数据都会转为辅助规则包的属性,而所有的操作都在辅助规则包中操作。

       在ckrule中,在一个规则包中调用其他规则包非常方便,可以有效解决数据转属性的问题。
    


中文版 | 英文版 ©2014 Ckrule规则引擎 版权所有