24

ラベル付きのbreakまたはcontinueを使用すると、コードが読みやすくなる場合があります。

OUTERLOOP: for ( ;/*stuff*/; ) {
    //...lots of code

    if ( isEnough() ) break OUTERLOOP;
    //...more code
}

ラベルの一般的な慣習は何だったのだろうかと思っていました。すべて大文字?最初のキャップ?

4

10 に答える 10

41

この「ラベルを使用しない」ルールがどこから来たのかわかりません。重要なループ ロジックを実行する場合、中断または継続するためのテストは、周囲のブロックの最後にあるとは限りません。

outer_loop:
for (...) {
  //  some code
  for (...) {
    //  some code
    if (...)
      continue outer_loop;
    //  more code
  }
  //  more code
}

はい、このようなケースは常に発生しています。代わりに何を使用することを提案していますか? このようなブール条件?

for (...) {
  //  some code
  boolean continueOuterLoop = false;
  for (...) {
    //  some code
    if (...) {
      continueOuterLoop = true;
      break;
    }
    //  more code
  }
  if (continueOuterLoop)
    continue;
  //  more code
}

うん! メソッドとしてリファクタリングしても、それは緩和されません。

boolean innerLoop (...) {
  for (...) {
    //  some code
    if (...) {
      return true;
    }
    //  more code
  }
  return false;
}

for (...) {
  //  some code
  if (innerLoop(...))
    continue;
  //  more code
}

確かに少しきれいですが、まだ余分なブール値が渡されています。また、内側のループがローカル変数を変更した場合、それをメソッドにリファクタリングすることが常に正しい解決策とは限りません。

では、なぜ皆さんはラベルに反対するのですか? 上記の場合のいくつかの確固たる理由と実用的な代替案を教えてください。

于 2008-08-19T09:46:52.577 に答える
20

大文字を使用してそれらを使用する必要がある場合、これはそれらに注意を引き、「クラス」名として誤って解釈されることからそれらを選び出します。それらに注意を引くことには、誰かの目を引くという追加の利点があり、コードをリファクタリングして削除します。;)

于 2008-08-19T03:41:53.530 に答える
15

慣例では、ラベルを完全に避けます。

ループから抜け出すためにラベルを使用する正当な理由はほとんどありません。ブレイクアウトは問題ありませんが、デザインを少し変更することで、ブレイクアウトの必要性を完全になくすことができます。与えた例では、「たくさんのコード」セクションを抽出し、意味のある名前を持つ個々のメソッドに配置します。

for ( ;/*stuff*/; ) 
{
    lotsOfCode();

    if ( !isEnough() )
    {
        moreCode();
    }
}

編集:問題の実際のコード(ここ)を見て、ラベルを使用することがコードを読みやすくするためのおそらく最良の方法だと思います。ほとんどの場合、ラベルを使用することは間違ったアプローチです。この場合、それは問題ないと思います。

于 2008-08-19T01:41:14.913 に答える
10

Sun の Java コード スタイルは、変数と同じ方法でラベルを命名することを好むようです。つまり、最初の文字が小文字のキャメル ケースを意味します。

于 2008-08-20T11:19:23.640 に答える
2

私が最もよく見た慣習は、メソッド名のような単純なキャメルケースです...

myLabel:

しかし、アンダースコアが前に付いたラベルも見ました

_myLabel:

またはラボで...

labSomething:

しかし、他の回答から、「ラベルを使用しない」以外のことを言うコーディング標準を見つけるのは難しいだろうと感じるかもしれません。答えは、一貫している限り、自分にとって意味のあるスタイルを使用する必要があるということです。

于 2008-08-19T08:25:47.500 に答える
1

ラベルが役立つことはめったにないため、明確な規則はないようです。Java 言語仕様には、ラベル付きの例が 1 つあり、non_cap になっています。

しかし、それらは非常にまれであるため、私の意見では、それらが本当に適切なツールであるかどうかをよく考えてください.

そして、それらが適切なツールである場合は、他の開発者 (または後で自分自身) が異常であることにすぐに気付くように、それらをすべて大文字にしてください。(クレイグがすでに指摘しているように)

于 2008-08-20T09:17:20.657 に答える
1

wrt sadie のコード例:

あなたがくれた

outerloop:
for (...) {
  //  some code
  for (...) {
    //  some code
    if (...)
      continue outerloop;
    //  more code
  }
  //  more code
}

例として。あなたは良い点を指摘します。私の最善の推測は次のとおりです。

public void lookMumNoLabels() {
  for (...) {
    // some code
    doMoreInnerCodeLogic(...);
  }
}

private void doMoreInnerCodeLogic(...) {
   for (...) {
      // some code
      if (...) return;
   }
}

しかし、そのようなリファクタリングが、実行しているロジックに正しく適合しない例があります。

于 2008-08-19T10:10:06.900 に答える
0

慣習/ベストプラクティスは、それらをまったく使用せず、コードをリファクタリングして、extractasメソッドを使用して読みやすくすることです。

于 2008-08-19T03:24:57.107 に答える
0

それらはJavaのgotoのようなものです-C#がそれらを持っているかどうかはわかりません。私は実際にそれらを使用したことがありません。それらを回避してもコードがはるかに読みやすくならない場合は考えられません。

しかし、あなたがしなければならないなら-私はすべてのキャップが大丈夫だと思います。ほとんどの人はラベル付きの区切りを使用しないため、コードを見ると、キャップが飛び出し、何が起こっているのかを理解するように強制されます。

于 2008-08-19T03:49:26.947 に答える
0

私は知っています、私はラベルを使うべきではありません。

しかし、ラベル付きの区切りから読みやすさを大幅に向上させる可能性のあるコードがあると仮定して、それらをフォーマットするにはどうすればよいですか。

Mo、あなたの前提は間違っています。問題は、「どのようにフォーマットするのですか?」であってはなりません。

あなたの質問は、「ループ内に大量のロジックを持つコードがあります-どうすればそれをより読みやすくすることができますか?」

その質問に対する答えは、コードを個々の適切な名前の関数に移動することです。そうすれば、休憩にラベルを付ける必要はまったくありません。

于 2008-08-19T03:50:42.593 に答える