需要实施 Drools 规则的设计指南
Need design guidance for implementing Drools rules
我在我的应用程序中使用 Drools 6.1.0。
我们计划编写一个包含所有规则的巨大 .drl 文件。
主要有两类规则
1.空检查
2. 业务验证
使用 ruleflow-group、activation-group 和 salience 我计划管理在将事实添加到会话时要执行/触发的规则。
即使使用这种方法,解决方案也不适合我,因为。
假设我有以下 .drl 文件
rule "rule1"
ruleflow-group "primary"
activation-group "NullCheck"
salience 5
when
$m : Message(innerMsg.something == null)
then
// do something
rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when
$m : Message(innerMsg.something.something == null)
then
// do something
rule "rule3"
ruleflow-group "primary"
activation-group "NullCheck"
salience 3
when
$m : Message(innerMsg.something.something.something == null)
then
// do something
Drools 文档这样说 "All constraints are evaluated when a fact is inserted. From the Drools manual: The condition evaluation is not tied to a specific evaluation sequence or point in time, but that it happens continually, at any time during the life time of the engine."
所以正在发生的事情是执行此文件的代码在规则 2 上抛出 Nullpointer 异常,因为 innerMsg.something.something
为 NULL
注意:我不想使用 || 组合所有空检查在单个 when 语句中,因为我想捕获特定的空条件并基于该条件创建错误消息。
我的问题如下。
- 使用 drools 规则对链接对象执行 Nullchecks 是个好主意吗?
- 我是否应该使用其他东西,比如顺序规则执行(不确定在 Drools 中是否可用)这将允许我按特定顺序执行规则。
- 还有其他方法可以实现吗
我认为 http://drools-moved.46999.n3.nabble.com/rules-users-Drools-Activation-Group-td3546598.html 可能与您所看到的内容相关。您可以尝试以下操作。
rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when
$m : Message(innerMsg != null)
Message(this == $m, innerMsg.something != null)
Message(this == $m, innerMsg.something.something == null)
then
这违背了你避免一堆 || 的愿望。在一定程度上,但它是一种不同的语法。
您无法避免的是使用使您的代码空安全。
要么为每个条件添加前缀以访问具有空测试的 Object 子类型的字段:
Fact( field != null && field.subfield == whatsoever )
或者您使用空安全解引用运算符:
Fact( field!.subfield == whatsoever )
请注意 ==
和 !=
是隐式空安全的,因此您可以写
Fact( field == whatever )
没有问题如果 field == null
。
尽快放弃使用activation-group和salience来实现流量控制的想法。它会导致非常糟糕的规则设计、不可维护的代码和普遍的不满。如果不会,请用 Java 或其他语言全部写下来。
我在我的应用程序中使用 Drools 6.1.0。
我们计划编写一个包含所有规则的巨大 .drl 文件。
主要有两类规则 1.空检查 2. 业务验证
使用 ruleflow-group、activation-group 和 salience 我计划管理在将事实添加到会话时要执行/触发的规则。
即使使用这种方法,解决方案也不适合我,因为。
假设我有以下 .drl 文件
rule "rule1"
ruleflow-group "primary"
activation-group "NullCheck"
salience 5
when
$m : Message(innerMsg.something == null)
then
// do something
rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when
$m : Message(innerMsg.something.something == null)
then
// do something
rule "rule3"
ruleflow-group "primary"
activation-group "NullCheck"
salience 3
when
$m : Message(innerMsg.something.something.something == null)
then
// do something
Drools 文档这样说 "All constraints are evaluated when a fact is inserted. From the Drools manual: The condition evaluation is not tied to a specific evaluation sequence or point in time, but that it happens continually, at any time during the life time of the engine."
所以正在发生的事情是执行此文件的代码在规则 2 上抛出 Nullpointer 异常,因为 innerMsg.something.something
为 NULL
注意:我不想使用 || 组合所有空检查在单个 when 语句中,因为我想捕获特定的空条件并基于该条件创建错误消息。
我的问题如下。
- 使用 drools 规则对链接对象执行 Nullchecks 是个好主意吗?
- 我是否应该使用其他东西,比如顺序规则执行(不确定在 Drools 中是否可用)这将允许我按特定顺序执行规则。
- 还有其他方法可以实现吗
我认为 http://drools-moved.46999.n3.nabble.com/rules-users-Drools-Activation-Group-td3546598.html 可能与您所看到的内容相关。您可以尝试以下操作。
rule "rule2"
ruleflow-group "primary"
activation-group "NullCheck"
salience 4
when
$m : Message(innerMsg != null)
Message(this == $m, innerMsg.something != null)
Message(this == $m, innerMsg.something.something == null)
then
这违背了你避免一堆 || 的愿望。在一定程度上,但它是一种不同的语法。
您无法避免的是使用使您的代码空安全。
要么为每个条件添加前缀以访问具有空测试的 Object 子类型的字段:
Fact( field != null && field.subfield == whatsoever )
或者您使用空安全解引用运算符:
Fact( field!.subfield == whatsoever )
请注意 ==
和 !=
是隐式空安全的,因此您可以写
Fact( field == whatever )
没有问题如果 field == null
。
尽快放弃使用activation-group和salience来实现流量控制的想法。它会导致非常糟糕的规则设计、不可维护的代码和普遍的不满。如果不会,请用 Java 或其他语言全部写下来。