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

Sur*_*nga 23 java eclipse pmd

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

 if(singleRequest !=null){
   // do my work
 }else{
   // do my other work
 }
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ker 33

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


小智 13

PMD是一种工具.PMD基于启发式工作.有人决定使用这种启发式方法; 使用else语句的负面条件不是"好风格".

但是,在这种情况下,正如我在评论中所论述的那样,发布的代码就是如何写它.(特别是x != null,但不仅限于此构造.)

这是因为我没有看条件(除了它可以简化;例如删除Jim Kin所示的双重否定),而是我看看分支或"流" 的逻辑.

也就是说,我首先放置正分支.在这种情况下,我认为

if (x != null) {
  doValid         // positive branch
} else {
  doFallback
}
Run Code Online (Sandbox Code Playgroud)

在语义上等同于

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

因此,首先是积极的分支.

当然,并非所有情况都有这种"明确的"正向流动,并且某些表达方式可能以消极的方式表达得更加容易.在这些情况下,我将"反转"分支 - 类似于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
} 
Run Code Online (Sandbox Code Playgroud)

这就是 一贯地(除了一些偶然的例外)编写我的代码:if (x != null) { .. }.使用可用的工具; 并让它们你工作.请参阅Steven关于如何在这里将PMD配置为更合适的"品味"的答案.


Bob*_*man 9

这是一个可读性问题.考虑

if ( x != y ) 
{
}
else  // "if x doesn't not equal y"
{
}
Run Code Online (Sandbox Code Playgroud)

if ( x == y )
{
}
else  // "if x doesn't equal y"
{
}
Run Code Online (Sandbox Code Playgroud)

后一个例子更容易识别.请注意,我认为使用底片并没有错...它可以更有意义,考虑一下

if ( x != null )...
Run Code Online (Sandbox Code Playgroud)

  • 不,这不是"可读性问题".这是一个"PMD问题".我一直使用`if(isValid){doValidWork} else {doFalbackWork}`.恰好是`!=`用于"isValid"条件. (4认同)
  • -1它*是*可读性,但与你的理由无关 (3认同)