2

PMDを使用してコードをチェックします。ほとんどの場合、非常に役立つヒントが得られますが、次のシナリオで何を改善できるかわかりません。

元のコードは次のようになります。

if ((getSomething() != null && getSomethingElse() != null)
     || (getSomething() == null && getSomethingElse() == null))
{
   ...
}

PMDは私に言います:

2 つの 'if' ステートメントは、条件をブール短絡演算子で区切ることによって統合できる場合があります。

簡単にするために、a と b をブール変数として使用します。次に、このコードは次のようになります。

if ((!a && !b) || (a && b))

これは、次のいずれかに変換できます。

if ((!a || b) && (a || !b))
if (!(a^b))

そして最後に

if (a==b)

だから私は私のコードを単純化しました

if ((getSomething() == null) == (getSomethingElse() == null))

ただし、PMD は不平を言い続けます (実際、3 つのバージョンすべてについて)。これは偽陽性ですか、それとも if 条件を記述するより良い方法はありますか?

4

3 に答える 3

3

問題は何か別のものでした。if ステートメントは、別の if 内の唯一のコードでした (コードは検証メソッドに由来します)。

if (...)
{
   ...
}
else if (...)
{
   ...
}
else if (...)
{
   if ((getSomething() == null) == (getSomethingElse() == null))
   {
      ...
   }
}

PMD メッセージが意味することは、最後の else-if と内側の if 節の条件を組み合わせることができるということです。

if (...)
{
   ...
}
else if (...)
{
   ...
}
else if (... && ((getSomething() == null) == (getSomethingElse() == null)))
{
      ...
}

ただし、元のバージョンの方がはるかに理解しやすいように見えるため、これを行うかどうかはわかりません。

于 2011-09-28T12:52:23.157 に答える
2
if ((a != null) && (b != null) && (a==b))

..個人的には、このifステートメントの前にnullチェックを実行して、a==nullとb==nullのケースを個別に処理できるようにします。

于 2011-09-28T12:28:40.027 に答える
1

問題は、条件文の大きなブロックを推論するのが難しいということです。

OTOH、PMDが発するすべての警告に注意を払う必要があるわけではありません-ROIを考慮してください。それをよりクリーンにするためにリファクタリングまたは再構築する価値はありますか?同じ機能を別の方法で処理できますか?

それが価値がない場合でも、気にしないでください。

于 2011-09-28T12:55:11.100 に答える