2011-03-31 205 views
3

假設你有這樣的代碼:打破了循環

function doSomething($array) 
{ 
    for($i = 0; $i < sizeof($array); $i++) 
    { 
    if ($array[$i] == "ok") 
     return true; 
    } 

    return false; 
} 

請注意,我說的不是PHP特定的(適用於所有語言)或這個特殊的例子。這是關於打破for循環(在這種情況下,返回true;停止循環)。

據我的一位老師介紹,這是非常非常糟糕的做法。

從循環中打破真的是一個未完成的實踐?

謝謝

+1

你的老師是否提供了他的陳述的任何理由? – 2011-03-31 14:48:54

回答

6

從循環中斷或返回是完全正確的。

你的老師可能指的是經典的函數應該只有一個返回點擴展爲循環。這背後的基本原理是,你的控制流程應該儘可能簡單易懂。這不是一個嚴格的規則,你必須服從而不思考。

要重寫你的樣品,而無需使用breakreturn

function doSomething($array) 
{ 
    $ret = false; 
    for($i = 0; $i < sizeof($array) && !$ret; $i++) 
    { 
    if ($array[$i] == "ok") 
     $ret = true; 
    } 

    return $ret; 
} 

這是痛苦的閱讀和維護。你的想法更加簡潔。

+1

當然,功能也有相反的學說:早期打破(返回)的規則。這意味着代碼的主流不會縮減,因此易於遵循,並且違反主流的所有條件都會堆疊在頂部。 – 2011-03-31 14:38:01

+0

謝謝你的回答。老師並沒有談論多點回歸,因爲她說「除了在開關語句之外,不要使用休息時間」。她還談到了多個回報點,但是,她並沒有遇到大問題,但她談論的是循環中斷是有史以來最糟糕的事情之一。 – Bv202 2011-03-31 14:42:40

+4

這是垃圾。編寫易於閱讀和維護的代碼。儘可能保持控制流暢。 如果你已經完成了開始循環*的工作,請打斷它。如果你完成了整個功能(包括清理),從它返回。而已。 – 2011-03-31 14:49:37

0

打破循環沒有什麼不好。它就像一個非常有限的轉到。不關心你的老師:-)

0

我不認爲這是一個打破循環的壞習慣。但是,我通常通過使用breakcontinue來完成,具體取決於具體情況。

0

人們通常會說使用breakcontinue(或其等價物)是不好的。我仍然使用它們:-P

另一種方法是將所有代碼包裝在ifelse中。

function doSomething($array) 
{ 
    for($i = 0; $i < sizeof($array); $i++) 
    { 
    if ($array[$i] != "ok"){ 
     // do stuff... 
    } 
    else{ 
     // do something else 
     // or omit this else block to do nothing 
    } 
    } 
} 

return的情況下循環。我建議你在循環外部設置一個變量,在需要時打破循環,然後返回變量。

$ret = false; 
function doSomething($array) 
{ 
    for($i = 0; $i < sizeof($array); $i++) 
    { 
    if ($array[$i] == "ok"){ 
     $ret = true; 
     break; 
    } 
    } 

    return $ret; 
} 
1

如果可能的話,我會遠離休息環節。如果你的循環變得越來越大,閱讀變得越來越困難。任何不熟悉你的代碼或特定函數的人都會認爲你的循環只是通過查看第一行來遍歷整個數組。做任何事情都是「令人驚訝的」,從而打破了CleanCode理念中的「最小驚訝原則」。如果你有多個條件退出你的循環,那麼for循環不是你應該尋找的。這就是while循環的用途。

function doSomething($array) { 
    $found = false; 
    $i = 0; 

    while ($i < sizeof($array) && !$found) { 
     if ($array[$i] == "ok") { 
      $found = true; 
     } 
     $i++; 
    } 

    return $found; 
} 
+0

這是做到這一點的一種方式,但是我認爲代碼比我的複雜得多.. – Bv202 2011-03-31 14:53:38

+0

在某些情況下,'while'肯定是最好的解決方案。但是,如果你可以在內部使用一個簡單的'foreach',那麼'break'不會聽起來有些不可讀... – kapa 2011-03-31 15:01:08

+0

有兩種循環(短的,如上面的那些和複雜的)。由於循環如上所述短而且便宜,while循環在某種程度上超過頂部,因此是休息時間。只需使用foreach並完成它。隨着複雜(和更昂貴的)循環來的可讀性的論點。在代碼中散佈的if或else子句中有一個或多個break的循環很難閱讀,應該避免while循環進入的地方。 – Nicktar 2011-03-31 15:11:18

1

我認爲這不是一個壞習慣。這些類型的東西,比如打破一個循環,或者在循環中使用返回都是不應該不小心做的事情。

當我還是初學者時,我總是聽到這些東西。不要使用它,或者不要使用它。但後來我意識到他們只是這樣說,通過不小心使用這些東西來防止新手犯下錯誤的錯誤。而那些沒有意識到這一點,後來成爲教師的人,會讓你遠離這些,因爲他們是邪惡的。

所以是的,使用它,有時非常非常方便。正如其他人在這裏提到的那樣,記下所有使用這些東西時必須關心的事情。瞭解何時不應該使用它們。

一兩件事:。得到數組的循環中的條件維度被認爲是不好的做法的確是你不想要得到每次迭代的大小

相反的:

for($i = 0; $i < sizeof($array); $i++) 

用途:

$size=sizeof($array); 
for($i = 0; $i < $size; $i++) 

1

Jackson這樣的一些程序設計認證並不真正成爲破環的朋友。這是一個頗具學術性的論點,在現實生活中並沒有真正遵循。