0

在编写流口水规则时,我是将检查分成更多规则还是将它们全部分组到一个规则中以在“那么”部分中有更多的ifs?不考虑任何管理问题,只考虑性能(例如执行时间、内存使用)。

假设我有多个任务,它们的条件和要做的事情 90% 相似,只剩下 10% 是特定于每个任务的。你写吗

rule A
when (90% conditions) and (task 1 or task 2 or task n)
then
    if (10% conditions for task 1) ...(10% stuff-to-do for task 1)
    else if (10% conditions for task 2) ...(10% stuff-to-do for task 2)
    else if (10% conditions for task n) ...(10% stuff-to-do for task n)
    (90% common stuff-to-do)
end

或者

rule B-1
when (90% conditions) and (10% conditions for task 1)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task 1)
end
rule B-2
when (90% conditions) and (10% conditions for task 2)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task 2)
end
rule B-n
when (90% conditions) and (10% conditions for task n)
then
    (90% common stuff-to-do) + (10% stuff-to-do for task n)
end

谢谢!

4

3 回答 3

3

我不是 Rete 引擎方面的专家,但一般规则是,只要决策在规则的左侧,引擎就能够优化其 Rete 树以确保可以最有效地做出决策。因此,将所有内容都保留在 LHS 上应该会更有效率。应该像瘟疫一样避免 LHS 中的“评估”。

当然,抛开微优化规则不谈,如果每个这样的决定都在单独的规则中声明,那么编写单元测试来评估是否在不同情况下激活了正确的规则是很简单的。如果您合并规则,那么您将不再能够测试您的规则是否在应该触发的时候触发。

于 2012-12-14T11:28:16.860 回答
2

我更喜欢第二个。有单独的小规则是干净的。因为 Drools 的目的是把你的 IF-ELSE 变成 RULES

于 2012-12-14T13:17:47.223 回答
1

您需要将它们分成单独的规则,而不是将条件和任务组合在一起,如下例所示。执行时间并不重要,这要归功于 RETE 和内存使用主要取决于您的事实,而不是规则。

通过将条件逻辑分成单独的规则,您将获得可测试和可管理的代码库。将所有内容放入一个大规则中与在纯 java 代码中使用 if-else 语句没有太大区别,在这种情况下,Drools 只会增加项目的复杂性而没有任何好处。

rule 90_1
when
    //first rule for common stuff
then
    //
end


rule 90_2
when
    //second rule for common stuff
then
    //
end


rule 90_N
when
    //last rule for common stuff
then
    //
end

rule A_1
when
    //first rule for A
then
    //
end


rule A_2
when
    //second rule for a
then
    //
end

rule B
when
    //rule for B
then
    //
end
于 2012-12-14T17:31:42.313 回答