定义常量或命名值的最佳方式
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 来存储常量,则可以创建调用 GetMember
或 TableLookup
的表达式模板。您没有强迫用户在各处编写相同的 table 查找语句,而是将该查找逻辑合并到 Vocab
的中央语句中
在 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 来存储常量,则可以创建调用 GetMember
或 TableLookup
的表达式模板。您没有强迫用户在各处编写相同的 table 查找语句,而是将该查找逻辑合并到 Vocab