有時,標籤打破或繼續可以使代碼更具可讀性。Java編碼標準/最佳實踐 - 打破/繼續標籤的命名約定
OUTERLOOP: for (;/*stuff*/;) {
//...lots of code
if (isEnough()) break OUTERLOOP;
//...more code
}
我想知道標籤的常見約定是什麼。全部大寫?第一帽?
有時,標籤打破或繼續可以使代碼更具可讀性。Java編碼標準/最佳實踐 - 打破/繼續標籤的命名約定
OUTERLOOP: for (;/*stuff*/;) {
//...lots of code
if (isEnough()) break OUTERLOOP;
//...more code
}
我想知道標籤的常見約定是什麼。全部大寫?第一帽?
如果你必須使用大寫字母,這會引起他們的注意,並將它們錯誤地解釋爲「Class」名稱。引起他們注意的還有捕捉別人的眼睛,並重構代碼並將其刪除的額外好處。 ;)
約定是完全避免標籤。
使用標籤打破循環的原因非常非常少。分手是好的,但你可以通過稍微修改你的設計來消除需要中斷的需求。在你給出的例子中,你將提取'大量的代碼'部分,並將它們放在具有有意義名稱的單獨方法中。
for (;/*stuff*/;)
{
lotsOfCode();
if (!isEnough())
{
moreCode();
}
}
編輯:見過有問題(over here)實際的代碼,我認爲標籤的使用可能使代碼可讀性的最佳方式。在大多數情況下,使用標籤是錯誤的方法,在這種情況下,我認爲它很好。
召集/最佳實踐仍然不會使用它們,並重構代碼,以便使用提取方法更易讀。
他們是Java的goto - 不知道如果C#有他們。我從來沒有在實踐中使用過它們,我不能想到避免它們會導致更多可讀代碼的情況。
但是,如果你有 - 我認爲所有大寫都可以。大多數人不會使用帶標籤的休息時間,所以當他們看到代碼時,帽子就會跳出來,迫使他們意識到發生了什麼。
我知道,我不應該使用標籤。
但假設,我有一些代碼,可以從標記中斷的可讀性中獲得很多,我如何格式化它們。
莫,你的前提是錯誤的。 這個問題不應該是'我如何格式化它們?'
你的問題應該是'我的代碼裏面有大量的邏輯邏輯 - 我如何使它更具可讀性?
該問題的答案是將代碼移動到單獨的,名字正確的函數中。那麼你根本不需要標記休息時間。
我最見過的約定是簡單的駝峯一樣的方法名稱...
myLabel:
,但我也看到有下劃線
_myLabel:
或前綴標籤實驗室...
labSomething:
雖然從其他答案中你可能會感覺到,你會很難推動找到一個除「不使用標籤」之外的任何其他標準的編碼標準。我猜想的答案是你應該使用任何風格對你有意義,只要它是一致的。
我不明白這個「不使用標籤」規則來自哪裏。當進行非平凡的循環邏輯時,中斷或繼續的測試並不總是整齊地位於周圍塊的末尾。
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
}
Yuck!重構它作爲一種方法不緩解,要麼:
boolean innerLoop (...) {
for (...) {
// some code
if (...) {
return true;
}
// more code
}
return false;
}
for (...) {
// some code
if (innerLoop(...))
continue;
// more code
}
當然這是一個有點漂亮,但它仍然在繞過一個多餘的布爾值。如果內部循環修改局部變量,將其重構爲方法並不總是正確的解決方案。
那麼,爲什麼你們都反對標籤?給我一些堅實的理由,併爲上述案件提供切實可行的選擇。
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;
}
}
但會有例子,其中那種重構不與你在做什麼邏輯正確坐。
由於標籤很少有用,因此看起來沒有明確的約定。 Java語言規範有一個帶有標籤的例子,它們在non_cap中。
但是,因爲它們非常罕見,所以我認爲最好是三思而後行,看他們是否真的是正確的工具。
如果他們是正確的工具,使他們全部上限,以便其他開發人員(或你自己以後)認識到他們是不尋常的東西馬上。 (正如克雷格已經指出的那樣)
Sun的Java代碼風格似乎更喜歡命名標籤的方式與變量相同,這意味着第一個字母是小寫字母。
*四年後更新:*對於像Scala和Clojure這樣的功能性語言有一個增長的趨勢,其中不使用標籤的建議有正當理由是有效的。但對於普通的Java,我上面的答案仍然存在。 – 2012-07-23 12:01:58