PMDはツールです。PMDはヒューリスティックに基づいて機能します。誰かがこのヒューリスティックを決定しました。elseステートメントを使用した否定的な条件は「適切なスタイル」ではありません。
ただし、この場合、コメントで議論したように、投稿されたコードは私がそれを書く方法です。(特に、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
}
これは私が 一貫して(いくつかの時折の例外は別として)私のコードを書く方法です:if (x != null) { .. }
。利用可能なツールを使用します。そしてそれらをあなたのために働かせます。PMDをより適切な「味」に設定する方法については、Stevenの回答を参照してください。