2011-01-26 59 views
13

我正在做一個CS類的基本Java項目。該項目有一個嵌套在while循環中的for循環。使用'return'來破壞Java中的for循環是否是不好的風格?

我是不允許使用break作爲早期結束for循環的一種方式。我發現return似乎與break有相同的效果。使用return作爲打破循環的一種方式是不好的風格?

我的for循環經歷了三個不同的語句來檢查,但如果它找到一個爲真,那麼它應該結束馬上不繼續檢查報表的其餘部分。

我試圖把一個布爾運算符while循環for循環控制,但不控制內發生的事情進行循環,直到for循環到達終點。

如果return不返回任何東西,這也有關係嗎?

299/01/11 更新:謝謝大家這麼多的意見。我發現通讀所有辯論真的很有幫助。

我跟我的導師和原來爲獲得滿分的目的,我不應該使用return無論是。

所以我發現在'for'循環中設置布爾值的建議確實很有幫助,因爲我不知道你可以這樣做。

+2

我不知道什麼是不允許使用'break'的背後令人費解的推理。 – andri 2011-01-26 13:53:48

+0

爲你的條件添加一個標誌。 – 2011-01-26 13:57:10

+1

@andri,因爲這是一個基本的Java類,我完全看到(並同意)爲什麼禁止打破。如果不是那麼機會是一半的答案將是可怕的,而(真)循環與他們中的斷言... – berry120 2011-01-26 14:41:54

回答

14

它們只有在突破循環後的第一件事是return陳述時纔會相同。

無論如何,如果您的講師不允許break,他們可能也不會允許return

你應該知道的是,這些規則的背後都有一個良好的基礎(以防止麪條代碼,使之更容易編寫可維護的代碼),但有時他們執行過熱忱。

例如,有什麼不可讀關於段:

if (x == 0) 
    return 0; 
return x - 1; 

即使它有多個return語句。

據推測是首選的解決了無數倍回報的人羣是一樣的東西:

int y = x - 1; 
if (x == 0) 
    y = 0; 
return y; 

是,在我看來,這兩個的可讀性和空間的浪費。

當你有非常複雜的邏輯和人們爲避免break和/或return而跳過的環節導致出現不可讀的條件時,會出現真正的問題。

聽聽你的講師 - 他們畢竟是控制你的成績的人。然後,一旦你進入現實世界,你可以從教條主義切換到實用主義,並且做出自己的想法。

瞭解有關教育機構以外的這些問題的一些好的建議請參見here

2

breakreturn是不一樣的。 break將停止執行最內層循環,return將從當前方法返回 - 即在該方法中將不會執行任何更多操作。據我所知,在循環中使用break沒有任何問題;大概這是一個人爲的要求,以便讓你思考替代邏輯。而且使用return也沒有錯;這可以幫助您避免可怕的嵌套條件(if子句)。

2

如果您不允許使用break,話很有道理不使用return爲好,因爲與break每個循環可以return被改寫爲一個循環(通過其外包到一個單獨的功能)。

從一個非作業點,break(和return)是非常有用的語言特性通常是認爲是不好的風格(當然,每一種語言結構可以被濫用來寫不好的代碼)。

但是,在您的家庭作業場景中,我認爲它會通過使用return將作業點擊敗break「解決方法」。你應該想辦法解決你的任務。

我試圖在while循環中放置一個布爾運算符,該運算符控制for循環,但不控制for循環內的內容,直到for循環結束。

這是事實,但是,通過使用if語句,你也可以執行/不執行代碼根據您的布爾環。

6

首先,它的不是不好使用的樣式break,如果你明智地使用它。
雖然我明白爲什麼你的教授現在堅持不用break(因爲很多人,尤其是初學者,往往會過度使用它),所以沒有理由完全禁止

使用return作爲打破循環的一種方式是不好的風格嗎?
就我個人而言,我認爲你會沒事的:代碼將變得更簡單。但顯然你的教授是這裏的上級。整個問題是非常主觀的,所以我不能告訴他。

但是,不管你的教授是什麼,在一個循環中使用return而不是一個不好的風格。

2

如果'返回' 不返回任何東西,這也有關係嗎?

這取決於你的方法的返回類型。如果返回類型是無效的,一個return子句必須是空的:

return; 

否則,返回子句必須返回所需的類型,例如

return true; // legal for boolean return type 
return null; // legal for all object types 
return "Hello"; // legal if return type is String 
1

您將得到相同的結果,但代碼質量和可讀性會降低。

2

你可以這樣

for (int i = 0; i < SOMELIMIT && (!found); ++i) {...} 
2

我想像你的導師希望你在的條件部分用於循環使用斷點條件,早期終止一個for循環。你需要在循環之前聲明這個條件並在循環中改變它。

boolean stop = false; 

for (...; ... && !stop; ...) { 
    ... 
    if (...) { 
     stop = true; 
    } 
} 
2

這是關於完美的代碼。

for(int i; i < stop; i++) { 
boolean flag = true; 

while(flag && condition) { 
    //some action 
    if(shouldIstop) { 
    flag = false; 
    } 
} 
} 

當您設置標誌設置爲false,那麼你將在退出時,當您將設置我停止,那麼你也會從退出。

3

從純粹的角度來看,break可以說是不應該使用的。 while循環的要點是,你使用循環開始時的條件來打破它,如果你開始用循環語句氾濫你的循環,而不是獲得正確的條件(這是一個快速入門的學生如果不能解決如何以正確的方式做事情,可能會被誘惑使用!)循環中繼續和返回也是一樣。

所有這些語言功能都是有原因和是的,有時它們是做事的最佳方式。然而,剛開始的時候,你明智而恰當地使用它們的機會很少,它們更可能被用作免費的「黑客讓我離開監獄而不理解這件事情如何運作」。而且,我認爲,這是一個很好的理由來禁止他們在基礎編程課程中使用。

5

這個問題似乎進入了一個很老的仍然沒有解決的論點,「單一與多個方法出口點」的領土。

因此,如果在迴路中使用回報讓您擔心(或您的老師),您(或他)可能會看看here

回答你的問題。 在我的(而不僅僅是我的)意見中使用循環返回肯定是好的。

但請注意,過度使用它可能會降低代碼的可讀性(有關詳細信息/示例,請參閱鏈接的答案)。

相關問題