2008-08-19 12 views
18

時には、ラベル付きブレークまたはコンティニューにより、コードをより読みやすくすることができます。Javaコーディング標準/ベストプラクティス - ブレーク/コンティニューラベルの命名規則

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

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

私は、ラベルの一般的な慣習が何であるか疑問に思っていました。すべて大文字?最初のキャップ?

答えて

16

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

15

慣習は、ラベルを完全に避けることです。

ループを中断するためにラベルを使用する正当な理由はごくわずかです。中断は大丈夫ですが、デザインを少し修正するだけで、中断する必要はなくなります。あなたが与えた例では、「たくさんのコード」セクションを抽出し、それらを意味のある名前を持つ個々のメソッドに入れます。

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

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

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

0

コンビネーション/ベストプラクティスは、それらをまったく使用しないでコードをリファクタリングするので、メソッドとして抽出を使用すると読みやすくなります。

0

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

しかし、もしあなたがしなければならない - 私はすべての大文字は大丈夫だと思う。ほとんどの人はラベル付き休憩を使用しないため、コードが表示されたときに大文字小文字が飛び出し、何が起こっているのかを認識させるようになります。

1

私はラベルを使用しないでください。

しかし、私はいくつかのコードを用意していますが、ラベル付きの改行から読みやすくすることができます。どのようにフォーマットするのですか?

モー、あなたの前提は間違っています。 「どのようにフォーマットするのですか?」という質問はしないでください。

あなたの質問には、「ループ内に大量のロジックを持つコードがあります。どのようにして読みやすくするのですか?

この質問への答えは、コードを個々のよく機能する関数に移動することです。次に、ブレークにラベルを付ける必要はありません。

1

私が最も見てきた慣例は...メソッド名のように、

myLabel: 

単にキャメルケースですが、私はまた、アンダースコア

_myLabel: 

かと接頭辞のラベルを見てきましたラボ

labSomething: 

あなたはおそらく、あなたが「ラベルを使用しないでください」以外の何かを言うコーディング標準を見つけるのは難しい、プッシュされます他の回答からいえ感じることができます。私が推測する答えは、それが一貫している限り、どんなスタイルでもあなたに合ったものを使うべきだということです。

33

この「ラベルを使用しない」ルールの由来はわかりません。トリビアルではないループロジックを実行するとき、ブレークまたは継続するテストは、周囲のブロックの終わりに常にきちんと終わっているとは限りません。

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 
} 

は確か。また、内部ループがローカル変数を変更した場合、それをメソッドにリファクタリングしても必ずしも正しい解決策ではありません。

なぜあなたはすべてラベルに反対していますか?私にいくつかの確固たる理由と、上記の場合の実際の選択肢を教えてください。

+10

※4年後に更新されました:* ScalaやClojureのような機能的な言語に向けて、ラベルを使用しないことのアドバイスが正当な理由で有効である傾向が高まっています。しかし、通常のJavaの場合、上記の私の答えはまだ立っています。 –

+0

javascrptとイベントベースの言語。したがって、豆の場合、非常に長い(おそらくあまりにも長い)イベント処理の一部でなければ、あまり有用ではないかもしれません。 – Cheruvim

+0

トップ投票の回答が元の質問に全く反応しないことが不思議です。 ( "*私はラベルのための共通の慣習が何だったのか疑問に思っていた。すべてキャップ?最初のキャップ?*") – Jonik

1

WRT sadie's code example

あなたは一例として

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; 
    } 
} 

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

1

ラベルはそれほど有用ではないので、明確な慣習がないようです。 Java言語仕様にはラベル付きの例が1つあり、non_capにあります。

しかし、彼らは非常に稀なので、私の意見では、彼らが本当に適切なツールであるかどうかを2回考えるのが一番です。

もしそれらが適切なツールであれば、他の開発者(または後で)がすぐに珍しいものとしてそれらを実現するようにそれらをすべて大文字にします。 (Craigがすでに指摘しているように)

5

SunのJavaコードスタイルは、変数と同じ方法でラベルに名前を付けることを好みます。これは、最初の文字が小文字であることを意味します。

関連する問題