2008-08-19 73 views

回答

16

如果你必須使用大寫字母,這會引起他們的注意,並將它們錯誤地解釋爲「Class」名稱。引起他們注意的還有捕捉別人的眼睛,並重構代碼並將其刪除的額外好處。 ;)

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 
} 

Yuck!重構它作爲一種方法不緩解,要麼:

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

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

當然這是一個有點漂亮,但它仍然在繞過一個多餘的布爾值。如果內部循環修改局部變量,將其重構爲方法並不總是正確的解決方案。

那麼,爲什麼你們都反對標籤?給我一些堅實的理由,併爲上述案件提供切實可行的選擇。

+10

*四年後更新:*對於像Scala和Clojure這樣的功能性語言有一個增長的趨勢,其中不使用標籤的建議有正當理由是有效的。但對於普通的Java,我上面的答案仍然存在。 – 2012-07-23 12:01:58

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語言規範有一個帶有標籤的例子,它們在non_cap中。

但是,因爲它們非常罕見,所以我認爲最好是三思而後行,看他們是否真的是正確的工具。

如果他們是正確的工具,使他們全部上限,以便其他開發人員(或你自己以後)認識到他們是不尋常的東西馬上。 (正如克雷格已經指出的那樣)

5

Sun的Java代碼風格似乎更喜歡命名標籤的方式與變量相同,這意味着第一個字母是小寫字母。