9

OOP 言語でブレーク アンド コンティニュ ラベルを使用することは、OOP プログラミング スタイルではないと言われました。なぜ、何が問題なのか詳しく説明していただけますか?

トリックは、このラベルの単語にありました。ブレーク/コンティニューというラベルを付けました。

class BreakWithLabelDemo {
    public static void main(String[] args) {

        int[][] arrayOfInts = {
            { 32, 87, 3, 589 },
            { 12, 1076, 2000, 8 },
            { 622, 127, 77, 955 }
        };
        int searchfor = 12;

        int i;
        int j = 0;
        boolean foundIt = false;

    search:
        for (i = 0; i < arrayOfInts.length; i++) {
            for (j = 0; j < arrayOfInts[i].length;
                 j++) {
                if (arrayOfInts[i][j] == searchfor) {
                    foundIt = true;
                    break search;
                }
            }
        }

        if (foundIt) {
            System.out.println("Found " + searchfor +
                               " at " + i + ", " + j);
        } else {
            System.out.println(searchfor +
                               " not in the array");
        }
    }
}

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/branch.html

4

5 に答える 5

27

おそらく、break と continue は、命令型プログラミングのメカニズムの 1 つである goto のような分岐ステートメントであることを意味しているとあなたに言った人です。

ブレーク/コンティニューでは、外側のステートメントにジャンプすることしかできません。つまり、コード内のどこにでも移動することはできません。したがって、同じメソッド オブジェクトにとどまるため、OOP と互換性がありません。

とにかく、break と continue は OOP ではないと言うのはナンセンスです。読みやすさへの影響については議論できますが、それだけです。

于 2012-06-21T07:22:42.767 に答える
19

break と continue は関数型プログラミングではありません。を示唆するOOPについては何もありません。メソッド内であっても悪い考えbreakですcontinuegoto

複雑さと混乱につながる可能性があるため、OOP 言語ではブレーク アンド コンティニューを使用することはお勧めできません。ラベルはめったに使用されないため、さらに混乱する可能性があります。問題に対する最も簡単な解決策であると感じた場合でも、それらを使用する必要があると思います。

// confusing use of LABEL
http://www.google.com/
do {
    if (condition) continue http;
} while(condition2)

別の紛らわしい使い方

GOTO: {
    // code
    if (condition)
         break GOTO; // without a loop
    // code
}

ラベルの上手な使い方

OUTER: 
for(outer loop) {
   for(inner loop)
      if (condition)
         continue or break OUTER;
}

ラベルの奇妙な使い方

FOUND: {
   for(loop)
      if(found)
          break FOUND;

   // not found
   handle not found
}
于 2012-06-21T07:14:26.380 に答える
5

ブレーク/コンティニューを使用しないというアドバイスは、おそらく実際にはOOPとは関係ありません。これは、これらのステートメントが悪名高いGOTOに類似しており、コードを完全に読み取れなくする可能性があるという事実に基づいています。しかし、教義は悪い助言です。主なパラダイムは、コードの読みやすさです。breakまたはcontinueを使用して最初の行のループからジャンプすることは、残り全体をif条件にするよりもはるかに明確です。

于 2012-06-21T08:35:14.670 に答える
2

Bruce Eckel は「Thinking in Java」の中で次のアイデアを書いています。

実際、ラベルを使用しない場合、多くの場合、コードのワークフローはより明確になります。

于 2012-06-21T07:15:16.900 に答える
-4

主な理由は、コードがブレーク アンド コンティニューであまり明確ではないことだと思います。

ただし、いくつかのパフォーマンスの問題もある可能性があります (OOP とは関係ありません): CPU は、この命令が処理される前に予測子を使用してキューに命令をロードします。条件付きジャンプの場合、次にロードする命令を予測子が検出するのは簡単ですが、無条件の場合は難しくなります。

于 2012-06-21T07:14:11.110 に答える