在编写drools规则时,我是否将检查分成更多规则或将它们全部归为一个规则,以便在“then”部分中包含更多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
谢谢!
答案 0 :(得分:3)
我不是Rete引擎的专家,但一般规则是只要决策在规则的左侧,引擎就能够优化其Rete树以确保最大程度地做出决策有效率的。所以它应该更有效地保持LHS上的所有内容。与瘟疫一样,应该避免LHS中同样的“eval”原因。
当然,撇开微优化规则,如果在单独的规则中声明每个这样的决定,那么编写单元测试很简单,这些测试评估在不同情况下是否已激活正确的规则。如果你合并了这些规则,那么你就无法再测试你的规则是否会被触发。
答案 1 :(得分:2)
我更喜欢第二个。拥有单独的小规则很干净。 因为Drools的目的是将你的IF-ELSE改为RULES
答案 2 :(得分: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