1

假设我在一家大型制造公司工作。我正在监控公司销售数据的质量。各个区域经理对其所在区域的销售都有自己的要求。8 个区域经理中的每一个都向我提供了一个 DRL 文件,该文件仅适用于他自己区域的销售,他们会经常对 DRL 进行调整。

让我们假设我正在使用一个销售对象,每个对象都包含一个区域属性。我不能对来自错误地区的销售应用规则。如果我不小心将太平洋西北地区的规则应用于俄亥俄河谷的销售,那么我将被解雇!

我可以想到三种方法来做到这一点:

  1. 信任(并验证)每个区域经理在每次提交新规则时在其规则的 LHS 中包含一个 region = "..." 术语。将所有 DRL 文件加载到 Kie 会话中并运行所有 Sales。
  2. 将我的 List<Sale> 划分为 8 个特定于区域的列表,并针对相应的 DRL 文件运行每个列表。
  3. 将销售抽象化并实现 PacificNorthwestSale、OhioRiverValleySale 等,其理论是给定区域的 DRL 文件可能不会尝试引用来自另一个区域的特定于区域的销售。

有没有更好的办法?有什么方法可以向 DRL 中的所有规则添加另一个 LHS 条件(区域 =“...”)?或者我可以通过其他方式强制执行此策略而无需执行以下操作:

  • 多个规则执行
  • 还是手动验证所有规则都指定了适当的区域?
4

1 回答 1

3

#1 已退出,因为没有万无一失的方法来确定在所有规则中都包含区域约束。(当然,这让你想知道:那些区域性的家伙是否足以正确地编写他们的规则,超出区域限制?怎么会?这些规则之一会计算他们的奖金吗?)

#2 安全无虞。它需要一些额外的处理,但这可以忽略不计。

#3 使 Java 代码库变得不必要地复杂。从本质上讲,在所有其他条件相同的情况下,匹配一个类的不同子类,只不过是#1 的糖化版本。唯一的好处是检查更容易,例如,您可以在每个 DRL 上运行一个简单的 grep。

如果在单个会话中运行所有内容比#2 所需的更方便,我会采用#4。为此,请以编程方式将 DRL 文件与一点“胶水”结合起来:

package what.ever;
import this.and.that.*;

agenda-group "PacificNorthwest"
// DRL from Pacific-Northwest

agenda-group "OhioRiverValley"
// DRL from Ohio River Valley

要运行,请将应用程序驱动程序中的焦点设置为这八个议程组中的每一个,然后插入适当的事实,确保在一个区域完成后清理 WM。

于 2015-09-23T04:58:54.410 回答