False postive for fb-contrib:SEO_SUBOPTIMAL_EXPRESSION_ORDER



Sonarqube认为以下代码违反了规则fb-contrib:seo_suboptimal_expression_order(注意,代码示例简化而不是逻辑):

>
class Foo {
   boolean baz;
   boolean foo() { 
      return bar() && baz==Baz.VALUE; //Violation of fb-contrib:SEO_SUBOPTIMAL_EXPRESSION_ORDER
   }
   boolean bar() { 
      return baz == Baz.VALUE_2; 
   }
}
enum Baz {
    VALUE, VALUE2
}

绩效 - 方法订单以次级最佳方式以条件的方式表达式 (fb-contrib:seo_suboptimal_expression_order)

此方法构建有条件的表达式,例如,在if或while语句中,表达式包含简单的本地变量比较以及方法调用的比较。表达式命令这些命令,以便在简单的局部变量比较之前进行方法调用。这会导致在不需要的情况下在条件下执行的方法调用,因此可能导致许多代码无需执行。通过订购表达式,以使包含局部可变条件的简单条件首先消除这种浪费。假设该方法调用没有副作用。如果该方法确实有副作用,则最好将这些调用从条件中拉出并首先执行,并将值分配给本地变量。这样,您提示呼叫可能会产生副作用。

我认为规则实现在实际表达式内部以及内容是值检查,然后不要触发违规行为。

这是一个错误还是我缺少某些东西?

您几乎已经在问题中给出了答案:

这会导致方法在不需要的情况下在条件下执行的方法,因此可能导致许多代码无需执行。通过订购表达式,以使包含局部可变条件的简单条件首先消除这种废物。

fb-contrib希望您扭转表达式:

boolean foo() { 
    return baz==Baz.VALUE && bar();
}

这样,仅在baz==Baz.value时才需要执行bar()。当然,这是编译器或JVM可能优化的东西,因此它将归结为微基准,以确定是否确实需要这种预防措施。

,但从句法层面上是有意义的,因为调用方法通常比价值检查更昂贵。因此,您无需查看该方法即可说明这一点。关于编译器/JVM的内部行为的任何猜测可能是错误的。

最新更新