web-dev-qa-db-ja.com

何が良いですか?複数のifステートメント、または複数の条件を持つif

私の仕事では、非常に特定のデータを選択する(Patternを使用して)非常に大きなXMLファイル(〜30万行)を解析する小さなJavaアプリケーションを開発する必要があります。私はこれらの2つのスニペットの間で何が良いのだろうと思っていました:

if(boolean_condition && matcher.find(string))
{
    ...
}

[〜#〜] or [〜#〜]

if(boolean_condition)
{
    if(matcher.find(string))
    {
        ...
    }
}

より高い精度:

  • これらのifステートメントは、ループ内の各反復で実行されます(〜20k反復)
  • boolean_conditionは、外部関数を使用して各反復で計算されるbooleanです
  • booleanfalseに設定されている場合、正規表現の一致をテストする必要はありません

ご協力いただきありがとうございます

38
3rgo

私が従う黄金律の1つは、できる限りネストを避けるです。しかし、単一のif条件を複雑にしすぎるという犠牲を払うなら、それを入れ子にすることは気にしません。

短絡を使用していることに加えて&&演算子。そのため、ブール値がfalseの場合、マッチングも試行しません!

そう、

if(boolean_condition && matcher.find(string))
{
    ...
}

行く方法です!

52
adarshr

次の2つの方法:

public void oneIf(boolean a, boolean b)
{
    if (a && b)
    {   
    }
}

public void twoIfs(boolean a, boolean b)
{
    if (a)
    {
        if (b)
        {       
        }
    }
}

メソッド本体に対してまったく同じバイトコードを生成するため、パフォーマンスの違いはありません。つまり、純粋にスタイルの問題であるということです(個人的には最初のスタイルを好みます)。

19
Jonathan

どちらの方法でも問題ありません。最初の条件がfalseの場合、2番目の条件はテストされません。

コードをより読みやすく理解しやすいものにするものを使用してください。 2つの条件の場合、最初の方法はより論理的で読みやすいです。 &&||、および!にリンクされた5つまたは6つの条件の場合は、もうそうではないかもしれません。

4
JB Nizet

Javaはこれらのブール演算子に短絡を使用するため、両方のバリエーションは機能的に同じです。したがって、boolean_conditionはfalseであり、マッチングを続行しません

最終的に、読みやすく、デバッグしやすいことがわかりますが、最後に大量のブレースが発生すると、深いネストが扱いにくくなる可能性があります

条件が長くなった場合に読みやすさを改善する1つの方法は、単純に複数行に分割することです。

if(boolean_condition &&
   matcher.find(string))
{
    ...
}

その時点での唯一の選択は、&&と||を置くかどうかです前の行の末尾、または現在の行の先頭。

2
Farrell

&&および||が多すぎますロジックスープにまとめられ、しばしば微妙なバグの原因になります。

別の&&または||を追加するだけでも簡単ですあなたが正しいと思うものに、既存のロジックを壊します。

これが一般的なルールであるため、要件の変化に応じて追加する誘惑を避けるために、どちらも使用しないようにします。

1
sm14

ソナールールsquid:S1066 に準拠したい場合は、ifステートメントを折りたたむ必要があります。

折りたたみ可能な「if」ステートメントをマージする必要があります

1
Petter Friberg

パフォーマンスの面では、それらは同じです。

  • しかし、彼らがそうでなかったとしても

このコードで時間を支配するのはほぼ確実であるのは、関数呼び出しであるためmatcher.find(string)です。

1
Mike Dunlavey

最初の1つ。そのようにネストする場合は避けようとします。スタイル/ ugいコードが貧弱だと思い、&&は短絡し、booleanがtrueの場合はmatcher.find()でのみテストします。

1
Robby Pond