3

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

例如,我不想要一堆幻数(可以很容易地复制)。例如“最低年龄”。我想定义一个命名常量,我可以用它MinimumAge来代替像 21 这样的值。

4

1 回答 1

3

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

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

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

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

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

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

2.内联数据表

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

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

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

3. 定义一个词汇模板(适用于所有方法)

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

如果申请人未满最低年龄,则将基本分数设置为最低基本分数。

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

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

于 2016-12-19T01:35:45.103 回答