2009-12-11 89 views
11

我髒了,每次我的感覺 「休息」 了一個for-each結構(PHP/Java腳本)的每個...打破

因此,像這樣:

// JavaScript示例

for (object in objectList) 
{ 
    if (object.test == true) 
    { 
     //do some process on object 
     break; 
    } 

} 

對於大型objectLists我會經過麻煩建設一個更好的解決方案。但是對於小名單來說,沒有明顯的性能問題,因此「爲什麼不呢?」這很快且更重要的是易於理解和遵循。

,但它只是「感覺不對」。有點像goto聲明。

你是怎樣處理這種情況?

+0

我知道你在說什麼,但是每個人都在正確的軌道上 - 休息很好,特別是對於小名單。我的大列表通常來自數據庫查詢,如果必須使用LIMIT函數,那麼只需拉取一部分記錄。簡短的回答 - 對使用「break」或「continue」不感到不好 – jbnunn 2009-12-11 17:20:56

+0

您的代碼不會以這種方式工作,因爲for..in運算符將始終迭代對象的鍵(字符串)。你可能的意思是這樣的: for(var key in objectList) { var object = objectList [key]; ... } – 2010-01-04 15:10:48

回答

27

我使用休息。這是一個完美的解決方案。

+16

使用單詞「cromulent」+1。 – 2009-12-11 17:22:05

+0

'cromulent'!我喜歡它 – 2009-12-11 17:35:07

+0

我喜歡「cromulent」的是它意味着它是什麼 - 從上下文來看,它是完全明顯的意思。 – 2009-12-11 17:38:03

1

我真的沒有看到anythign錯爆發的for循環。除非你有某種類型的散列表,字典中有某種鍵來獲取價值,否則沒有別的辦法。

1

我會使用一個break聲明。

2

對於小名單,有與沒有這樣做,問題。 正如你所提到的,你可能想要考慮一個更加「優雅」的大型列表解決方案(尤其是未知大小的列表)。

有時感覺錯了,但它的所有權利。你會學會愛上break及時。

+0

我不知道....我已經編程了大約15年。我這樣做(使用休息),它只是有時候似乎在作弊...... – ChronoFish 2009-12-11 19:07:32

2

像你說的「」爲什麼不呢?「這是快速,更重要的是容易理解和遵循。」

爲什麼覺得髒,我看沒有錯。

2

我認爲是更容易閱讀,因此更容易維護。

2

它的目的是要喜歡它。 Break旨在跳出循環。如果你在循環中找到你需要的東西,爲什麼要保持循環?

0

也許我誤解了你的用例,但爲什麼要打破?我假設你期望測試對於列表中的至多一個元素是真實的?

如果沒有性能問題,並且您想清理代碼,那麼您總是可以跳過測試和休息。

for (object in objectList) 
{ 
    //do some process on object 
} 

這樣,如果您確實需要在多個元素上執行該過程,您的代碼將不會中斷(雙關語意)。

+0

我只會打破我想找到第一個(或唯一)項目以匹配我的測試條款的情況。簡單地讓循環繼續就是在這些情況下燃燒循環。 – ChronoFish 2009-12-11 19:05:22

+0

這取決於你是否更關心燒腦循環或CPU週期。打破是一種優化 - 它可能是一個合理的,但如果清單很小,那麼考慮將它放出去,直到你知道你需要它爲止。 – ctford 2009-12-12 14:11:18

0

我的選擇是簡單地用一個break。這很快,通常不會使事情複雜化。

如果使用forwhile,或do while循環,你可以使用一個變量來確定是否要繼續:

for ($i = 0, $c = true; ($i < 10) && $c; $i++) { 
    // do stuff 

    if ($condition) { 
     $c= false; 
    } 
} 

只有這樣,才能從foreach環打破是breakreturn

+0

我這樣做,雖然通常只有一個'while'循環。 – Tenner 2009-12-11 17:26:24

+4

所以你寧願添加一個標誌,五行,而&&'而不是'break;'? – Tordek 2009-12-11 17:26:56

+0

-1這是沒有好處的 – JonH 2009-12-11 17:28:58

5

它的快速和更重要的是容易理解和遵循。

不要覺得不好突破。後藤被折磨,因爲它很快,更重要的是而不是易於理解和遵循。

2

打破並繼續不是gotos。他們在那裏是有原因的。只要您完成循環結構,就會脫離循環。現在

,我會避免非常,非常深的嵌套(又名箭頭設計反模式)。

if (someCondition) 
{ 
    for (thing in collection) 
    { 
     if (someOtherCondition) 
     { 
      break; 
     } 
    } 
} 

如果您打算休息一下,那麼請確保您已經構建了代碼,以便它只有一層深度。使用函數調用來保持迭代儘可能淺。

if (someCondition) 
{ 
    loopThroughCollection(collection); 
} 

function loopThroughCollection(collection) 
{ 
    for (thing in collection) 
    { 
     if (someOtherCondition) 
     { 
      doSomethingToObject(thing); 
      break; 
     } 
    } 
} 

function doSomethingToObject(thing) 
{ 
    // etc. 
} 
+0

曾幾何時,我開始編程時,我有一個非常酷的嵌套if語句的密碼檢查.... :) – starcorn 2009-12-11 18:07:59

0

使用

Object object; 
int index = 0; 

do 
{ 
    object = objectList[index]; 
    index++; 
} 
while (object.test == false) 

如果從for環斷絕使你感到不安。

+0

這假設一個數字索引。 – ChronoFish 2009-12-11 18:57:14

+0

只要可以列舉並且有一種方法可以從一個項目到另一個項目,就可以將其擴展到任何種類的索引。 – luvieere 2009-12-11 19:14:23

4

見,打破也不來煩我在所有。編程是的跳轉,和破 - 像所有的控制結構 - 僅僅是轉到的專用表格旨在提高代碼的可讀性。 不要爲編寫可讀代碼而感到不快!現在

,我覺得髒有關直接比較,以true尤其使用類型轉換操作符平等時......哦,是的。你寫的 - if (object.test == true) - 相當於寫作if (object.test),但需要更多的思考。如果你真的想要只比較object.test是一個布爾值true,那麼你會使用the strict equality operator (===) ......否則,請跳過它。

+2

關於「==真」事物的好處。我總是想要建議人們使用「if((object.test == true)== true)」,只是爲了看看他們是否有多可笑。 – 2009-12-11 19:42:48

1

一般有什麼不對的break聲明。但是,如果這些塊出現在代碼庫的不同位置,則代碼可能會成爲問題。在這種情況下,對於重複代碼,break語句的代碼很小。

您可以輕鬆地提取搜索到一個可重複使用的功能:

function findFirst(objectList, test) 
{ 
    for (var key in objectList) { 
    var value = objectList[key]; 
    if (test(value)) return value; 
    } 
    return null; 
} 

var first = findFirst(objectList, function(object) { 
    return object.test == true; 
} 
if (first) { 
    //do some process on object 
} 

如果你總是處理以某種方式找到的元素,可以進一步簡化代碼:

function processFirstMatch(objectList, test, processor) { 
    var first = findFirst(objectList, test); 
    if (first) processor(first); 
} 

processFirst(
    objectList, 
    function(object) { 
    return object.test == true; 
    }, 
    function(object) { 
    //do some process on object 
    } 
} 

所以,你可以使用JavaScript中的功能特性使您的原始代碼更富有表現力。作爲一種副作用,這會將break聲明從常規代碼庫中推送到輔助函數中。