在InRule中定义常量或命名值的最佳方法是什么?
e.g。我不想要一堆神奇的数字(可以轻易复制)。例如"最低年龄"。我想定义一个命名常量,我可以使用MinimumAge
来代替像21这样的值。
答案 0 :(得分:3)
有很多不同的方法可以解决这个问题。我将概述一些可以解决您问题的一般方法。
通过一些设计考虑,您可以使用初始化为默认值的字段,可以通过将(从调用应用程序)适当的配置数据传入规则引擎来覆盖这些字段。
在实体上创建计算字段,将表达式值设置为所需的常量。当添加额外的常量并实现其他根上下文入口点时,这不能很好地扩展。
为了应对这种复杂性的增长,这种模式有很多变化,可以通过福勒的重构来缓解上述情况:
创建内联表以保存规则使用的这些和其他常量值。然后,您将查找适当的值(请参阅上面有关初始化规则集的段落,因为此处的概念也适用于此。)
通过适当地构建规则,您可以从"定义常量的最佳方法是什么来重新解释问题?" to"如何将数据驱动的行为写入我的规则?"。
进行讨论并决定在哪里以及谁将拥有config / const类型的数据非常重要,既是业务决策,也是架构决策。
返回所需常量的表达式模板可以是一种简洁的方法,使用户能够编写如下规则(粗体常量):
如果申请人处于最低年龄,请将基本分数设为最低基本分数
无论您采用何种方法,除了最简单的场景之外,您应该考虑使用Vocab模板来促进重用并减少规则作者的摩擦。 Vocab很棒,因为它本质上是一个任意定义的可重用的参数函数。它的缺点是必须用BL(商业语言)编写规则才能利用Vocab模板。
例如,如果您决定使用查找表来存储常量,则可以创建一个调用GetMember
或TableLookup
的表达式模板。您没有强迫用户在整个地方编写相同的表查找语句,而是将查找逻辑整合到Vocab的中心语句中