6.决策表
简介
决策表是一种以表格形式表现规则的工具,它非常适用于描述处理判断条件较多,各条件又相互组合、有多种决策方案的情况,决策表提供精确而简洁描述复杂逻辑的方式,可将多个条件及与这些条件满足后要执行动作以图形化形式进行对应,对于决策表的定义,我们提供的是全可视化、图形化的操作方式,通过简单的鼠标点击就可以快速定义出与业务相匹配的决策表。
打开URule Pro的控制台,在项目的“决策表”节点上右键,从弹出的菜单中选择“添加决策表”项,就可以创建一个决策表文件,如下图所示:
使用决策表
可以看到,在决策表当中,同样需要我们导入需要使用的变量库、参数库、常量库及动作库。
和规则集中的规则一样,可以为决策表添加若干属性,但不同的是决策表中可添加的属性只有五个,其含义和作用与决策集中的规则相同,这里不再赘述,如下图所示:
一旦为决策表定义了属性,那么这些属性将会被应用到决策表中定义的每个规则上。
实际使用当中,我们可能会将若干个决策表或若干个决策表与若干个决策集放在一个知识包中使用,这个时候如果没有使用决策流来对它们的执行顺序进行编排的话,那么优先级属性的作用就显现出来,通过定义优先级属性,可以实现若干个决策表文件与若干个决策集文件放在一个知识包中执行顺序的编排,也就是优先级的值越大,执行越靠前。
URule Pro中的决策表,整体可分为左右两个部分,分别是条件列部分与动作列部分,它们之间以一较粗的灰黑色线分隔,该线左边为条件列,右边则为动作列。在导入好相关的变量库或参数库后,那就可以在条件列的列头上右键,通过右键菜单选择当前条件要绑定的变量或参数,如下图所示:
在URule Pro当中,所有的弹出菜单在不选择菜单项目时,如果需要隐藏,那么必须在空白处双击才能实现隐藏,之所以这样做是为了防止用户因为误单击而出现已弹出菜单隐藏的情况。同时对于所有的二级菜单,如果菜单项目超过20个,在二级菜单顶部会出现过滤框,可在这个框中对二级菜单项目进行过滤,以快速找到目标菜单项。
要设置决策表的条件,我们必须先为条件列设置好与之绑定的变量或参数,否则是无法设置当前条件列下单元格中的条件的。URule Pro中的决策表提供了三种类型的动作列,分别是:赋值动作列、执行方法动作列以及控制台输出动作列。
所谓的赋值动作列,就是指在条件列相关对应条件满足后对某个目标变量或参数进行赋值,同样在设置赋值动作列时,必须先插入一个赋值动作列,然后选择与当前绑定的参数或变量名称,最后才能在当前列对应的单元格中输入具体值,在对应的条件满足时为目标变量或参数赋值,如下图所示:
执行方法动作列就是在这个列当中,在相关条件满足时执行指定的方法。执行方法动作列与赋值动作列不同,我们需要做的就是添加一个执行方法动作列,而不用将该列与任何变量、参数或方法绑定,添加好执行方法动作列后,就可以在该列对应的单元格中添加具体的要执行的方法即可,如图所示:
所谓的控制台输出动作列,就是将该列对应的单元格里设置的内容直接输出至控制台,其效果与Java中的System.out.println(...)效果完全一致。
添加好条件列并配置好与之绑定的参数和变量后,接下来就可以在该列对应的单元格添加具体的条件,添加条件方法比较简单,在目标单元格右键,在弹出的菜单中选择“配置条件”项即可。
在弹出的配置条件窗口中,可以看到,这个配置条件的窗口采用的是向导式条件配置方式,与“向导式规则”中条件配置方式基本一致,不同的地方是向导式决策表中向导式条件配置不能添加“联合条件”,同时对于单个条件不用指定条件左值(这是因为当前条件列的列头已与具体的参数或变量绑定,这个绑定的参数或变量就是其下所有条件单元格条件的左值),如下图所示:
对于赋值动作列,在绑定好要赋值的参数或变量后,就可以在该列对应的单元格中选择输入具体的值,可以看到在对赋值动作列对应的单元格设置值时,其可选值的范围与操作方式与“向导式规则”中条件右值的设置方式完全相同。
对于执行方法动作列,在设置其下具体单元格中要执行的方法时,我们需要先导入包含已定义好方法的动作库文件,否则是无法操作的,一旦导入动作库文件,我们就可以设置执行方法动作列下对应的单元格中需要执行的方法:
在设置具体要执行的方法时,与“向导式规则”中动作设置中执行方法部分的设置完全相同。
对于控制台输出动作列,其设置方式与赋值动作列基本一致,唯一不同的地方是它不需要设置与该列绑定的参数或变量,因为它作用就是将当前列单元格中定义的内容直接输出到控制台,所以一般用于调试。
在决策表的单元格中,无论是条件部分单元格还是动作部分单元格,如果某些单元格内容相同或类似,那么可以在源单元格中右键,从菜单里选择复制,到目标单元格粘贴即可,这样就可以实现决策表内容的快速编辑。 后面要介绍的复杂决策表、评分卡之类都可以采用这种复制粘贴机制。
复制粘贴时有一点需要注意,那就是复制的条件部分只能粘贴到条件单元格中,动作单元格也是这样。
下面是一个已设置好的向导式决策表的截图,在这个例子当中,有三个条件列,两个动作列。
在上面的截图中,按一行一个规则的标准来计算,最张生成的规则有八个。因为一行对应一条规则,所以在上面的截图当中,第一行对应的规则用脚本式规则表现就是下面的样子:
if
员工.car==true && 员工.house==true && 员工.married==true
then
员工.username="张三";
out(员工.username);
end;
从Excel中导入决策表
URule Pro中的决策表支持从外部的Excel中导入,在Excel中按要求定义好决策表,然后导入即可使用。打开决策表编辑器,可以看到工具栏上有“导入Excel”按钮,点击该按钮在弹出的窗口中选择要导入的Excel文件即可。如下图所示Excel:
导入后决策表效果如下:
我们来看下Excel中如何定义决策表(下载这个Excel)。
Excel中定义决策表,与URule Pro中实际的决策表区别不大,也分为条件列和动作列,我们先来看看条件列如何定义。
条件列
对于条件列的列头支持变量及参数两种类型的值,如上图中的“员工.年龄”、“员工.性别”两个条件列采用的都是变量,在定义的时候要求我们在要导入的项目中已定义好对应的变量,比如这里的“员工”,那当前要导入的项目中要有一个变量分类名为“员工”,这样导入时引擎会自动查找这个变量分类,如果Excel里定义里某个变量分类或具体分类,但在项目中不存在这么个变量分类或变量,则在导入时会失败。
列头在定义时要放在第一行,这是必须的,否则在导入时会产生错误。列头定义好后,接下来就可以定义对应的具体条件了。条件在定义时只需要具体的比较操作符及条件右值即可,如下图所示:
多条件连接时与、或可使用 || 及&&表示,如果是等于(==),则等于号可省略不写,如下图所示:
上图中,“员工.性别”属性只能为男和女两种,在定义条件时可不写等于号;“员工.年龄”最后一个条件中等于65或70或80也省略了等于号。需要特别指出的是,多条件不支持括号,不能用括号把多个条件连接。
动作列
动作列支持两种类型:一种是用于赋值的动作列(如上图中的员工.薪水以及员工.地址两列都是用于赋值操作的);另一种就是输出到控制台的动作列(如上图中的控制台输出列)。在URule Pro当中通过为列头添加备注来区分当前动作列是赋值列还是输入到控制台的列。如果是赋值列,则需要为列头添加“赋值”或“assign”的字符串备注,如果是输出到控制台的列,则列表添加“控制台输出”或"out"的字符串备注,如下图所示:
定义好动作列表后,在下面的行中就可以定义具体的内容,需要指出的是,目前内容只支持字符数字之类的简单值,不支持内容里采用别的参数或变量或调用方法等。同时在Excel中定义决策表时,决策表需要放在第一个Sheet页中,对于定义的决策表外观上的修饰不影响决策表的导入,如上图中决策表边线及背景色等有无皆可。
到这里Excel也就定义好了,接下来只需要打开我们的决策表文件,选择工具栏上的“导入Excel”按钮,将这个Excel文件导入即可使用。
示例
我们采用之前定义好的“会员”这个变量来实现一个简单的决策表示例,通过对当前会员自身各个条件的判断,从而给会员的“级别”属性赋值,做好的决策表如下图所示:
在这个例子当中,有三列条件,第一列是年龄,第二列是婚否,第三列是性别;在年龄列中,我们将年龄划分为四个区段,每个区段又通过第二列的婚否和第三列的性别拆分出四个条件,所以上面的决策表在运行时共有16个规则产生, 且每个规则都是互斥的;最后一列是变量赋值列,在每行条件满足后都会对“会员”变量的“等级”属性进行赋值。
配置好决策表后,我们可以直接点击工具栏上的快速测试按钮对当前决策表文件进行快速测试;也可以将当前决策表文件添加到一个知识包当中,然后点击这个知识包操作菜单中的快速测试菜单项对知识包里的决策表文件进行测试; 两种测试方式不同但效果和结果完全一致,定义好相关输入、输出,点击快速测试窗口上的测试按钮即可实现对当前决策表文件的测试,这里就不再赘述。