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

Best means of defining constants or named values

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

例如我不想要一堆神奇的数字(可以很容易地复制)。例如 "minimum age"。我想定义一个命名常量,我可以像 MinimumAge 那样使用它来代替像 21.

这样的值

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

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

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

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

为了管理这种复杂性的增长,此模式有许多变体可以缓解上述几乎直接来自 Fowler 的 Refactoring

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

2。内联数据 table

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

通过适当地构建规则,您可以将问题从 "What is the best way to defined constants?" 改写为 "How do I write data-driven behavior into my rules?"。

就 config/const 类型数据的所有者和位置进行讨论并做出决定很重要,这既是业务决策,也是架构决策。

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

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

If the applicant is under the minimum age, set base score to minimum base score

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

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

的中央语句中