2011-11-05 67 views
62

我尋找過這個,但找不到答案,無論出於何種原因,我太羞恥地問教授,由於那種感覺,當數百人盯着你...如果我省略Java中的大括號可以嗎?

無論如何,我的問題括號的重要性是什麼?我可以忽略它們嗎?例如:

for (int i = 0; i < size; i++) { 
    a += b; 
} 

VS

for (int i = 0; i < size; i++) 
    a += b; 

我知道他們兩個的工作,但如果我省略了括號(我傾向於做了很多,由於能見度)將是改變任何東西,任何事情在所有?正如我所說,我知道它是有效的,我測試了十幾次,但現在我的一些任務變得越來越大了,出於某種原因,我有非理性的擔心,從長遠來看,這是我的原因嗎?有沒有理由擔心呢?

回答

101

除了之外,它不會改變任何東西代碼的可維護性。我見過這樣的代碼:

for (int i = 0; i < size; i++) 
    a += b; 
    System.out.println("foo"); 

這意味着這樣的:

for (int i = 0; i < size; i++) 
    a += b; 
System.out.println("foo"); 

...但應該一直這樣:

for (int i = 0; i < size; i++) { 
    a += b; 
    System.out.println("foo"); 
} 

我個人總是包括括號減少混淆的可能性讀取或修改代碼時。

在每一個公司,我爲有需要這個工作的編碼約定 - 這是不是說,其他一些公司不具備不同的約定......

和公正的情況下,你覺得它永遠不會有所作爲:我必須修復一次與上面的代碼非常相當的錯誤。很難發現......(不出所料,這是幾年前,我開始進行單元測試之前,這無疑使它更容易診斷)。

+0

是的,我意識到這個問題,我沒有使用括號,當只有一行後,如果... – vedran

+9

@vedran:所以你知道這個問題,但你只是假設它永遠不會咬你?而且每個閱讀你的代碼的人都會知道該期待什麼?我只是說 - 有一個原因,爲什麼他們在我已經與之合作的編碼規範中被要求:) –

+11

我只是覺得自己像一個私人人士一樣被嘲笑。是的,儘管對我來說更方便,但我的團隊中的其他人卻覺得這很麻煩,也很麻煩。從現在開始,我會確保使用括號。 – vedran

10

沒有區別。與第二版的主要問題是,你可能最終寫這:

for (...) 
    do_something(); 
    do_something_else(); 

當您更新方法,以爲do_something_else()被稱爲循環內。 (這導致頭刮調試會話。)

還有第二個問題,即撐版本沒有,它可能更難發現:

for (int i=0; i<3; i++); 
    System.out.println("Why on earth does this print just once?"); 

因此,保持大括號,除非你有一個很好的理由,這只是一些擊鍵。

+3

第一點是好的,但第二點是錯誤的。大括號版本仍然可以有這個問題。 for(int i = 0; i <3; i ++); {System.out.println(「爲什麼只打印一次?」); }。我知道,因爲我總是使用大括號,但有時會錯誤地添加額外的分號。 – emory

+3

大括號版本可以擁有它,但是如果大括號在同一行上,則更明顯。確實,在下一行的支架上,它非常討厭。 – Mat

+0

對於我來說,第二個版本與第一個版本同樣重要,因爲在第二個版本中,幾乎不可能發現什麼是錯誤的,直到你真正運行它才能看到世界正在發生什麼。開發人員花費大量時間調試這樣的代碼,如果引入這些冗長的支架,很容易被發現。對我而言,省略那些波浪形括號不僅僅是一種風格問題,而且是可能的錯誤代碼的良好指示。 –

4

如果您有一條語句,您可以省略括號,對於聲明一個代碼塊所需的更多的語句括號。

當您使用您聲明的代碼塊括號:

{ 

//Block of code 
} 

的括號也應使用只有一個語句時,你是在爲提高可讀性嵌套聲明的局面,因此,例如:

for(; ;) 
    if(a == b) 
    doSomething() 

它更可讀寫有括號也如無必要:

for(; ;) { 
    if(a == b) { 
    doSomething() 
    } 
} 
3

使用方括號將來的修改代碼對未來進行驗證。我曾經看過一些情況,其中省略了括號,並且有人後來添加了一些代碼,並且當時沒有放置括號。結果是他們添加的代碼沒有進入他們認爲它所做的部分。所以我認爲答案就是根據未來對代碼的更改,它的良好實踐。我見過軟件組採用這種標準作爲標準,即出於這個原因,即使使用單行塊也總是需要括號。

+0

我同意這一點。括號不適合你。他們是爲了身後的人。有幾次,我有代碼,我堅持認爲我不熟悉,沒有使用括號,並有不好的縮進。在這個階段,我可能正在修復一個bug,所以很高興知道應該發生什麼。省略大括號使其不太明顯,我必須逐步完成代碼,浪費時間。 –

4

如果使用括號,代碼更具可讀性。 如果您需要在同一個模塊中添加一些運算符,則可以避免可能的錯誤

2

更多支持我的「always braces」組。 如果你忽略了單語句循環/分支支架,把語句放在同一行作爲控制語句,

if (condition) doSomething(); 
for(int i = 0; i < arr.length; ++i) arr[i] += b; 

這樣,它更難當體膨脹忘記插入括號。不過,反正使用捲曲。

26

使用大括號使代碼更易於維護和理解。所以你應該認爲它們默認爲

我有時會跳過使用大括號guard clauses使代碼更緊湊。我對此的要求是,它們是if語句,後面跟着語句,如returnthrow。另外,我將它們放在同一行,以引起對該習語的注意,例如:。

if (!isActive()) return; 

它們也適用於內部代碼循環:

for (...) { 
    if (shouldSkip()) continue; 
    ... 
} 

而對於其他跳躍條件從不一定在方法體的頂部的方法。

一些語言(如Perl和Ruby)有一種條件語句,其中括號不適用的:

return if (!isActive()); 
// or, more interestingly 
return unless (isActive()); 

我認爲這是相當於什麼,我剛纔所描述的,但明確支持該語言。

+6

+1 guard clause in inside如果沒有花括號,循環通常更清晰。 – Viccari

+2

同意守衛條款。在我看來,使代碼更具可讀性,並且實際上提高了可維護性。雖然接受的答案是非常有效的,所以我會限制省略括號來防止子句。 – ChrisK

4

我認爲如果你還使用自動格式,那麼鬆散大括號是好的,因爲比縮進總是正確的,所以很容易發現任何錯誤。

說大括號離開花括號是壞的,怪異的或不可讀的只是錯誤的,因爲整個語言是基於這個想法,並且它非常流行(python)。

但我不得不說,如果不使用格式化程序,它可能是危險的。

+0

縮進在Python中很重要。在Java,C,C++或其他C風格的語言中,它沒有。 –

+0

@ChristopherSchneider這是蓬。 –

1

結果明智,這是同樣的事情。

只有兩件事情需要考慮。

- 代碼可維護性
- 鬆散耦合的代碼。 (可以執行 別的東西,因爲你沒有指定爲循環的範圍。)

注:在我的觀察,如果是循環使用的循環。沒有大括號的內環也是安全的。結果不會變化。

0

如果在循環中只有一條語句,它是相同的。

例如看到下面的代碼:

for(int i=0;i<4;i++) 
      System.out.println("shiva"); 

我們在上面的代碼只有一個語句。所以沒有問題

for(int i=0;i<4;i++) 
      System.out.println("shiva"); 
      System.out.println("End"); 

這裏我們有兩條語句,但只有第一條語句進入循環內部,但不是第二條語句。

如果您在單循環下有多個語句,您必須使用大括號。

3

對於大多數情況下,到目前爲止提到的答案是正確的。但從安全角度來看,它有一些缺點。在支付團隊工作之後,安全性成爲決定動機的更強有力的因素。可以說你有以下代碼:

if("Prod".equals(stage)) 
    callBankFunction (creditCardInput) 
else 
    callMockBankFunction (creditCardInput) 

現在讓我們說你有這個代碼不工作,由於一些內部問題。你想檢查輸入。所以,你做如下改變:

if("Prod".equals(stage)) 
    callBankFunction (creditCardInput) 
else 
    callMockBankFunction (creditCardInput) 
    Logger.log(creditCardInput) 

說你解決問題,(&你認爲這不會造成,因爲它不是一個問題「刺」的條件內,也許審稿)部署此代碼。神奇的是,您的生產日誌現在可以打印客戶的信用卡信息,所有可以看到日誌的人員都可以看到這些信息。上帝禁止他們中的任何人(有惡意的意圖)掌握這些數據。

因此,不給予大括號和粗心大意的編碼通常會導致違反安全信息。它也被劃分爲JAVA中的一個漏洞,由CERT - Software Engineering Institure, CMU

+0

我認爲這是一個非常糟糕的設計,但重要的是有效的。 –

1

如果刪除大括號,它只會讀取第一行指令。任何額外的行將不會被讀取。如果您有超過1行的指令要執行,請使用大括號 - 否則會引發異常。

0

使用冗餘大括號聲稱代碼更易維護提出以下問題:如果編寫代碼的人想知道並進一步維護代碼時遇到類似前面描述的問題(縮進相關或可讀性相關),那麼他們可能不應該編程在所有...

0

它應該是一個反射重新格式化代碼以及...那當然是專業團隊中的專業程序員

0

對於簡單的事實來說,最好使用大括號來調試這將是一個極端的麻煩。但其他方面,一行代碼不一定需要括號。希望這可以幫助!

0

現在,很容易重新縮進代碼,以找出哪個代碼塊在哪個iffor/while。如果你堅持重新縮進是很難做到的,那麼放在錯誤縮進處的括號可能會讓你感到困惑。

for(int i = 0; i < 100; i++) { if(i < 10) { 
    doSomething(); 
} else { for(int j = 0; j < 5; j++) { 
     doSomethingElse(); 
    } 
}} 

如果你在任何地方都這樣做,你的大腦就會很快分崩離析。即使使用括號,您也依賴縮進來直觀地查找代碼塊的開始和結束。

如果縮進非常重要,那麼您應該已經使用正確的縮進方式編寫代碼,以便其他人不需要重新縮進代碼即可正確讀取。

如果你想爭辯說,前面的例子是太假/深思熟慮,並且括號內是有捕捉粗心壓痕問題(尤其是當你複製/粘貼代碼),然後再考慮這一點:

for(int i = 0; i < 100; i++) { 
    if(i < 10) { 
    doSomething(); 
} 
else { 
    for(int j = 0; j < 5; j++) { 
     doSomethingElse(); 
    } 
} 

是的,它看起來不像前面的例子那麼嚴重,但是你仍然可以通過這種縮進感到困惑。

恕我直言,編寫代碼的人負責檢查代碼,並確保在他們繼續執行其他操作之前正確縮進。

相關問題