2009-12-11 4 views
11

Я чувствую грязный каждый раз, когда я "перерыв" из-за каждую конструкцию (PHP/Javascript)для каждого ... сломать

Так что-то вроде этого:

// Javascript пример

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

} 

Для больших объектных списков я бы рассмотрел сложное строительство более элегантного решения. Но для небольших списков нет заметной проблемы с производительностью, и поэтому «почему бы и нет»? Это быстро и, что важнее, легко понять и следовать.

Но он просто «чувствует себя не так». Это похоже на утверждение goto.

Как вы справляетесь с такой ситуацией?

+0

Я знаю, что вы говорите, но все на правильном пути - перерыв в порядке, особенно для небольших списков. Мои большие списки, как правило, из запросов БД, и если я должен использовать функцию LIMIT, чтобы вытащить только подмножество записей. Короткий ответ - не нужно плохо использовать «break» или «continue». – jbnunn

+0

Ваш код не будет работать так, потому что оператор for..in всегда будет перебирать ключи (строки) объекта. Вы, вероятно, имеете в виду что-то вроде этого: for (var key in objectList) { var object = objectList [key]; ... } –

ответ

27

Я использую перерыв. Это идеальное решение.

+16

+1 для использования слова «croulent». –

+0

'cromulent'! Мне нравится –

+0

Что мне нравится в «cromulent», так это то, что это значит - слово, которое совершенно очевидно, что это означает из контекста. –

1

Я действительно не вижу ничего неправильного с выходом из цикла for. Если у вас нет какой-либо хеш-таблицы, словарь, в котором у вас есть какой-то ключ для получения значения, на самом деле нет другого пути.

2

Для небольших списков нет никаких проблем с этим. Как вы упомянули, вы можете подумать о более «элегантном» решении для больших списков (особенно списки с неизвестными размерами).

Иногда это кажется неправильным, но все в порядке. Вы научитесь любить break вовремя.

+0

Я не знаю .... Я программировал около 15 лет. Я делаю это (используйте перерыв), это просто кажется мошенничеством иногда .... – ChronoFish

2

Как вы сказали «почему бы и нет?» Это быстро и, что важнее, легко понять и следовать ».

Зачем чувствовать себя грязным, я не вижу ничего плохого в этом.

2

Я думаю, что читать легче и, следовательно, проще в обслуживании.

2

Он должен быть таким. Break предназначен для выпрыгивания из цикла. Если вы нашли то, что вам нужно в цикле, почему нужно продолжать цикл?

0

Возможно, я не понимаю ваш случай использования, но зачем вообще ломаться? Я предполагаю, что вы ожидаете, что тест будет истинным для всего одного элемента в списке?

Если нет проблемы с производительностью, и вы хотите очистить код, вы всегда можете пропустить тест и перерыв.

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

Таким образом, если вам нужно сделать процесс более чем одного элемента код не сломается (каламбур).

+0

Я бы только сломал случаи, когда я хочу найти первый (или только) элемент, чтобы соответствовать моему тестовому предложению. Просто позволить циклу продолжать - это просто сжигание циклов в этих случаях. – ChronoFish

+0

Это зависит от того, вы больше озабочены сжиганием мозговых циклов или процессорных циклов. Ломать - это оптимизация - она ​​может быть оправданной, но если список мал, подумайте о том, чтобы оставить его, пока не узнаете, что вам это нужно. – ctford

0

Мое предпочтение заключается в том, чтобы просто использовать break. Это быстро и, как правило, не усложняет ситуацию.

Если вы используете for, while или do while петлю, вы можете использовать переменную, чтобы определить, следует ли продолжать:

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

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

Единственный способ вырваться из foreach цикла является break или return ,

+0

Я делаю это, хотя обычно только с циклом 'while'. – Tenner

+4

Итак, вы предпочтете добавить флаг, пять строк и '&&' than 'break;'? – Tordek

+0

-1 это не выгодно – JonH

5

Это быстро и, что более важно, легко понять и следовать.

Не чувствуйте себя плохо в случае перерыва. Goto нахмурился, потому что это быстро и, что более важно, не легко понять и следовать.

2

Перерывы и проходы не являются доступными. Они там не просто так. Как только вы закончите с петлевой структурой, выйдете из петли.

Теперь, я бы избегал очень, очень глубокого гнездования (a.k.a. дизайн стрелочной конструкции против шаблона).

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-statements для проверки пароля .... :) – starcorn

0

Используйте

Object object; 
int index = 0; 

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

если нарушение из for цикла заставляет вас чувствовать себя неловко.

+0

Это предполагает числовой индекс. – ChronoFish

+0

Расширьте идею до любого индекса, если она может быть перечислина, и есть способ перейти от одного пункта к другому. – luvieere

4

См., Перерыв не вызывает меня вообще. Программирование построено на goto, а for-break - как и все структуры управления - всего лишь специальная форма goto предназначена для улучшения читаемости вашего кода. Никогда не чувствуйте себя плохо в написании читаемого кода!

Теперь я сделать чувствует себя грязным о прямых сравнениях с true, особенно при использовании типа-преобразованиях оператора равенства ... Ах да. То, что вы написали - if (object.test == true) - эквивалентно написанию if (object.test), но требует больше размышлений. Если вы действительно хотите, чтобы сравнение было успешным только в том случае, если object.test является как логическим значением , так иtrue, то вы использовали бы the strict equality operator (===) ... В противном случае пропустите его.

+2

Хорошая мысль о «истинной» вещи. Я всегда хочу предложить, чтобы люди использовали «if ((object.test == true) == true)», просто чтобы узнать, насколько они выглядят как это смешно. –

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 из вашей обычной базы кода в вспомогательную функцию.

Смежные вопросы