作者 | Carole-Ann Berlioz
译者 | 王鹏
休假回来,我准备处理一个新的有趣的项目,交付几个客户项目和即将推出的产品。尽管有很多人提出过需求,但我从未花时间来撰写有关规则编写的最佳实践。让我们抓紧时间吧!对于决策管理行业的老手来说,似乎有些最佳实践对我们来说是完全显而易见的。但是,很少有文献可以帮助业务分析师设计最佳的业务规则。
在本系列的整个过程中,我的目标是记录一些准则,所有业务分析人员都应该知道这些准则以便在规则编写方面表现的更出色。我将从最简单的建议开始,这些建议我们已经应用近20年了。
那么在编写规则时应该考虑什么呢?
无论您使用哪种工具编写规则,语法都会涵盖很多功能,有些功能可能会给您带来麻烦。开始时,我曾考虑从我们的SMARTS产品中删除这些可能带来问题的功能。但是在某些情况下这些功能又确实有用,所以我们还是保留了它们……但要注意的是,只有在确实需要的情况下才应使用它们。
不要使用OR
规则通常由一组条件和一组动作组成。这些条件为“与关系”或“或关系”。例如,你可以检查:
-申请人是学生
-并且他小于21岁。
或者,您可以检查:
–申请人是学生
–或申请人未满21岁。
尽管这些句子在自然语言中都有意义,但在决策管理专业领域,我们不赞成第二种写法。我们强烈建议您在决策逻辑中仅使用AND,而不要使用OR。
首先,AND和OR的混合搭配会让逻辑变得混乱。就像数学中的运算顺序一样:它会让您头疼。没有括号,表达式会变得非常混乱。例如,如果您检查以下内容:
–申请人是学生
–或他未满21岁
–并且他来自加利福尼亚…
该规则适用于25岁佛蒙特州的学生吗?此外,每个引擎产品都有特定的逻辑运行顺序,AND和OR的混合搭配在不同产品间的运行顺序可能是不一致的。
除了造成混乱之外,OR还很难跟踪每个规则的业务影响。规则引擎提供了强大的功能,可以报告每个规则执行(触发)的次数,并能基于此做更多的决策分析。如果将地区的要求与年龄的要求捆绑在一起,则将无法利用这些分析。这种影响是不可低估的。
那为什么我们还要保留OR逻辑?我认为这主要是历史原因造成的。当我们开始使用专家系统时,它就已经存在了。还有一些复杂的规则,它们只寻找OR场景下有用的方案。
在大多数情况下,可以使用IN关键字更优雅地处理此问题。如果您的规则检查的是加利福尼亚州或佛蒙特州,则只需检查该州是否在加利福尼亚州佛,蒙特州列表中即可。
不要使用ELSE
从历史上看,规则可以包含ELSE语句。当条件集不满足时,将执行ELSE语句中的动作集而不是THEN语句中的动作集。
从自然语言来讲,这完全是说的通的。但在规则管理上,这是很容易出问题的。例如,如果某条规则要求:加利福尼亚州年满17岁的申请人符合资格,那么ELSE语句将对任何其他州的任意年龄的申请人进行处理,这显然是没有意义的。
在一些例子中,条件集为互逆关系。当它为真时,会发生一些事情。如果不为真,则会发生其他情况。
但在大多数情况下,您不止用一条规则来定义规则要校验的情形。在这种情况下,您可能会考虑使用规则集的全局“ELSE”语句。我见过一些规则集,这些规则集需要对规则的所有例外编写复杂的否定语句。编写和维护这类规则集很头疼。
我的建议是,如果您的系统中支持默认行动,则此处最好的设计是使用默认行动。默认行动通常在规则集级别定义,并且在没有规则触发时适用。
如果您的规则引擎没有默认行动,建议您使用两步过程。第一步,执行处理异常的规则。他们可能会修改状态或记录某些内容(提示错误,升级产品,等等)。第二步,在一个单独的规则集中,基于第一步标记的状态,执行那些正常状态应该执行的规则。
不使用优先级
这又是一个历史遗留问题。优先级使一条规则可以超越所有其他规则,优先执行。当您使用RETE算法时,可能需要这样做,RETE使用推理,RETE下的规则执行与顺序无关,如果业务需求上对规则执行顺序有要求,那么就需要指定规则的优先级。
但是在大多数情况下,您不需要用RETE算法。出现在规则集中的规则顺序决定了规则的执行顺序。如果您使用优先级,执行顺序会改变。这可能会造成混乱,因为您项目中的下一位业务分析师可能会错过这个小细节,并且很长一段时间以来都在想,为什么某个原本会触发的规则不会被触发。
如果规则需要按特定顺序执行,那么最好的办法就是对它们重新排序,系统中也按顺序显示。如果您的逻辑太复杂,请简化设计:将您的决策分解为多个步骤。比如,可以用一个规则集来确定申请人是否有资格使用产品,而另一步则对适用的产品进行排名,选择最佳的产品。
让我引用一下Nicolas Boileau-Despreaux的名言,他的话启发了我如何编写规则!
“What isconceived well is expressed clearly, And the words to say it will arrive withease.
联系客服号获取更新文档
星标我,每天多一点智慧