if(x!=y) vs if(x==y)

2022-09-01 21:46:36

我已经在Eclipse中针对我的代码运行了PMD插件,并且我收到了类似于如下所示的代码的高优先级警告:

 if(singleRequest !=null){
   // do my work
 }else{
   // do my other work
 }

PMD 说`Avoid if (x != y) ..; else ..;

错误的描述如下所示:

In an "if" expression with an "else" clause, avoid negation in
the test.  For example, rephrase:
if (x != y) diff(); else same();
as:
if (x == y) same(); else diff();
Most "if (x != y)" cases without an "else" are often return

但我仍然无法理解对我的代码的影响。如果有人能用一个例子指导我,我将不胜感激。


答案 1

许多PMD规则比正确性警报更具有风格意见。如果您不同意此规则或该规则与项目的编码标准不匹配,则可以考虑禁止显示警告,甚至将 PMD 配置为仅强制执行您喜欢的规则


答案 2

PMD是一种工具。PMD 的工作原理基于启发式方法。有人决定采用这种启发式方法;带有其他语句的否定条件不是“好风格”。

但是,在这种情况下,正如我在评论中所说,发布的代码是我编写它的方式。(特别是 使用 ,但不是专门针对此构造。x != null

这是因为我不看条件的(除非它可以简化;例如,删除Jim Kin所显示的双负数),而是我看分支或“流”的逻辑。

也就是说,我将正分支放在第一位。在这种情况下,我认为

if (x != null) {
  doValid         // positive branch
} else {
  doFallback
}

在语义上等效于

if (isValid(x)) { // it looks like a "positive conditional" now
  doValid         // still positive branch
} else {
  doFallback
}

因此是正分支优先。

当然,并非所有情况都有如此“清晰”的正向流动,有些表达方式可能更容易以否定的方式表达。在这些情况下,我将“反转”分支 - 类似于PMD所建议的 - 通常带有注释,说明如果正分支/流被反转,则在块的顶部说明操作。

另一个可能影响所用条件选择的因素是“立即范围退出”分支,例如:

if (x == null) {
  // return, break, or
  throw new Exception("oops!");
} else {
  // But in this case, the else is silly
  // and should be removed for clarity (IMOHO) which,
  // if done, avoids the PMD warning entirely
} 

这就是我一贯(除了一些偶尔的例外)编写代码的方式:。使用可用的工具;并让他们为你工作。请参阅Steven的答案,了解如何将PMD配置为更合适的“味道”。if (x != null) { .. }


推荐