定义常量或命名值的最佳方法

时间:2016-12-15 14:14:10

标签: rule-engine inrule

在InRule中定义常量或命名值的最佳方法是什么?

e.g。我不想要一堆神奇的数字(可以轻易复制)。例如"最低年龄"。我想定义一个命名常量,我可以使用MinimumAge来代替像21这样的值。

1 个答案:

答案 0 :(得分:3)

有很多不同的方法可以解决这个问题。我将概述一些可以解决您问题的一般方法。

通过一些设计考虑,您可以使用初始化为默认值的字段,可以通过将(从调用应用程序)适当的配置数据传入规则引擎来覆盖这些字段。

1。计算或初始化的实体字段

在实体上创建计算字段,将表达式值设置为所需的常量。当添加额外的常量并实现其他根上下文入口点时,这不能很好地扩展。

为了应对这种复杂性的增长,这种模式有很多变化,可以通过福勒的重构来缓解上述情况:

  • 将配置数据提取到(参数)对象
  • 不使用计算字段,而是编写初始化规则集。建议使用Explicit RuleSet来精确控制初始化时间。在控制规则集中,添加调用init规则的Execute RuleSet操作。 编辑:更正指导

2。内联数据表

创建内联表以保存规则使用的这些和其他常量值。然后,您将查找适当的值(请参阅上面有关初始化规则集的段落,因为此处的概念也适用于此。)

通过适当地构建规则,您可以从"定义常量的最佳方法是什么来重新解释问题?" to"如何将数据驱动的行为写入我的规则?"。

进行讨论并决定在哪里以及谁将拥有config / const类型的数据非常重要,既是业务决策,也是架构决策。

3。定义词汇表模板(适用于所有方法)

返回所需常量的表达式模板可以是一种简洁的方法,使用户能够编写如下规则(粗体常量):

  

如果申请人处于最低年龄,请将基本分数设为最低基本分数

无论您采用何种方法,除了最简单的场景之外,您应该考虑使用Vocab模板来促进重用并减少规则作者的摩擦。 Vocab很棒,因为它本质上是一个任意定义的可重用的参数函数。它的缺点是必须用BL(商业语言)编写规则才能利用Vocab模板。

例如,如果您决定使用查找表来存储常量,则可以创建一个调用GetMemberTableLookup的表达式模板。您没有强迫用户在整个地方编写相同的表查找语句,而是将查找逻辑整合到Vocab的中心语句中