首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fb的假正性:SEO_次优表达顺序?

fb的假正性:SEO_次优表达顺序?
EN

Stack Overflow用户
提问于 2017-03-09 10:35:46
回答 1查看 1K关注 0票数 2

SonarQube认为下面的代码违反了FB-cont肋骨规则:SEO_亚优_ example _ORDER(注意,代码示例是简化的,而不是逻辑的):

代码语言:javascript
复制
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
}

Performance以一种次优的方式以条件排序表达式(fb-cont肋骨:SEO_亚优_EXPRESSION) 例如,此方法在if或while语句中构建一个条件表达式,其中表达式既包含简单局部变量比较,也包含对方法调用的比较。表达式对这些进行排序,以便方法调用位于简单局部变量比较之前。这会导致方法调用在不需要执行的条件下执行,因此可能导致许多代码被无偿执行。通过对表达式排序,以便首先使用包含局部变量条件的简单条件,可以消除这种浪费。这假设方法调用没有副作用。如果该方法确实有副作用,那么最好将这些调用从条件中提取出来,并首先执行它们,为局部变量分配一个值。通过这种方式,您可以提示呼叫可能有副作用。

我认为规则实现查看实际表达式是合理的,如果内容是值检查,那么就不会触发违规行为。

这是个窃听器还是我漏掉了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-21 20:41:31

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

这会导致方法调用在不需要执行的条件下执行,因此可能导致许多代码被无偿执行。通过对表达式排序,以便首先使用包含局部变量条件的简单条件,可以消除这种浪费。

FB-Con肋骨想让你转过头来表达:

代码语言:javascript
复制
boolean foo() { 
    return baz==Baz.VALUE && bar();
}

这样,bar()只需要在baz==Baz.value的情况下才能执行。当然,这是编译器或JVM可能会优化的东西,因此需要通过一个微基准来确定这种预防措施是否真的是必要的。

但是这在句法层面上是有意义的,因为调用一个方法通常比一个值检查更昂贵。所以你不需要看里面的方法就知道了。对于编译器/ JVM的内联行为的任何猜测都可能是错误的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42693012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档