Java コーディング標準 / ベスト プラクティス - ブレーク/継続ラベルの命名規則
-
08-06-2019 - |
質問
場合によっては、ラベル付きの Break または continue を使用すると、コードがはるかに読みやすくなることがあります。
OUTERLOOP: for ( ;/*stuff*/; ) {
//...lots of code
if ( isEnough() ) break OUTERLOOP;
//...more code
}
ラベルの一般的な慣例は何なのか疑問に思っていました。すべて大文字?最初のキャップ?
解決
使用する必要がある場合は大文字を使用することで注意を引き、誤って「クラス」名として解釈されないようにすることができます。それらに注意を引くことには、コードをリファクタリングして削除する誰かの目に留まるという追加の利点もあります。;)
他のヒント
この「ラベルを使用しない」というルールがどこから来たのか理解できません。重要なループ ロジックを実行する場合、中断または続行するテストが周囲のブロックの最後に常にきちんと配置されるとは限りません。
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
}
確かに少しはきれいになっていますが、それでも不必要なブール値を渡しています。また、内部ループでローカル変数が変更された場合、それをメソッドにリファクタリングすることが常に正しい解決策であるとは限りません。
では、なぜ皆さんはレーベルに反対するのでしょうか?上記の場合の確かな理由と現実的な代替案をいくつか教えてください。
慣例として、ラベルは完全に避けます。
ループから抜け出すためにラベルを使用する正当な理由はほとんどありません。ブレークアウトは問題ありませんが、デザインを少し変更することでブレークアウトの必要性をまったくなくすこともできます。あなたが示した例では、「大量のコード」セクションを抽出し、意味のある名前を付けて個々のメソッドに配置します。
for ( ;/*stuff*/; )
{
lotsOfCode();
if ( !isEnough() )
{
moreCode();
}
}
編集: 問題の実際のコードを見たところ、ここに)、コードを読みやすくするにはラベルを使用するのがおそらく最良の方法だと思います。ほとんどの場合、ラベルを使用するのは間違ったアプローチですが、この場合は問題ないと思います。
Sun の Java コード スタイルでは、変数と同じようにラベルに名前を付けること、つまり最初の文字を小文字にしたキャメル ケースを好むようです。
私がよく見た規則は、メソッド名のような単純なキャメルケースです...
myLabel:
しかし、アンダースコアが接頭辞として付けられたラベルも見たことがあります
_myLabel:
または研究室で...
labSomething:
ただし、他の回答からも、「ラベルを使用しない」以外のコーディング標準を見つけるのは難しいことがわかります。答えは、一貫性がある限り、自分にとって意味のあるスタイルを使用するべきだということだと思います。
に関して セイディのコード例:
あなたがくれた
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;
}
}
しかし、そのようなリファクタリングが、実行しているロジックがどのようなものであっても正しく適合しない例もあるでしょう。
ラベルが役に立つことはほとんどないため、明確な規則はないようです。Java 言語仕様には、ラベルを含む 1 つの例があり、それらは non_cap にあります。
しかし、それらは非常にまれであるため、それらが本当に適切なツールであるかどうかをよく考えたほうが良いと私は思います。
そして、それらが適切なツールである場合は、他の開発者 (または後で自分自身) がそれが異常なものであることにすぐに気づくように、すべて大文字にしてください。(クレイグがすでに指摘したように)
慣例/ベスト プラクティスは、依然としてそれらをまったく使用せず、メソッドとして抽出を使用してコードをリファクタリングして読みやすくすることです。
これらは Java の goto のようなものです。C# にあるかどうかはわかりません。私は実際にこれらを使用したことがありません。これらを避けてもコードが読みやすくならないというケースは思いつきません。
しかし、どうしても必要な場合は、すべて大文字で大丈夫だと思います。ほとんどの人はラベル付きブレークを使用しないため、コードを見るとキャップが目に飛び込んできて、何が起こっているのかを理解する必要があります。
ラベルを使用すべきではないことはわかっています。
しかし、ラベル付きの区切りによって可読性が大幅に向上する可能性のあるコードがあると仮定してください。それらをどのようにフォーマットすればよいでしょうか。
モーさん、あなたの前提は間違っています。質問は「どうやってフォーマットすればいいですか?」ということではありません。
あなたの質問は、「ループ内に大量のロジックを含むコードがあります。コードを読みやすくするにはどうすればよいですか?」というものでなければなりません。
この質問に対する答えは、コードを適切な名前の付いた個別の関数に移動することです。そうすれば、休憩にラベルを付ける必要はまったくありません。