首先绑定变量是否有优势,而不是在同一模式的表达式中使用它?

时间:2017-04-11 22:06:32

标签: drools

我想知道的是首先绑定一个变量然后在一个表达式中以相同的模式使用它比首先执行表达式而不进行绑定然后如果表达式求值为true则执行绑定以便我们有值在下一个模式或后一部分。

例如我们接下来有三种情况:

rule "first doing binding and using that value for the expression"
   when
       Pattern1($var : var, $var > 10, $var < 20)
   then
       System.out.println($var);
end

rule "first doing binding and using the value from the original variable"
   when
       Pattern1($var : var, var > 10, var < 20)
   then
       System.out.println($var);
end

rule "first doing expression with using the value from the original variable and then doing the binding if the expression is evaluated to true"
   when
       Pattern1(var > 10, var < 20, $var : var)
   then
       System.out.println($var);
end

对我而言,最后一个案例最有意义,但我希望看到一个意见。

如果在模式之外不需要变量,那么进行绑定也没有任何意义吗?

1 个答案:

答案 0 :(得分:2)

这主要是品味问题。我的意见:

  • 如果您不想在其他地方使用字段值,请不要绑定变量。 (客观论点:它只会使代码混乱并让你怀疑它是否在其他地方使用过。)
  • 坚持&#34;标准&#34;模式,它是一个短语中的绑定和约束,使用字段(而不是变量)使绑定后跟一个约束短语
  • 在一个字段上使用单个表达式来表示多个相似(!)约束

所以我的首选方式是:

Pattern1( $var: var, var > 10 && < 20)
Pattern2( $var: var > 10 && < 20)

请注意,#1允许您使用约束对带有绑定和约束的绑定进行分组,这可能更具可读性。