перерыв в петле - PullRequest
       21

перерыв в петле

3 голосов
/ 31 марта 2011

Предположим, у вас есть этот код:

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

  return false;
}

Обратите внимание, что я не говорю о специфических для PHP (это относится ко всем языкам) или об этом конкретном примере. Речь идет о разрыве цикла for (в этом случае возвращает true; останавливает цикл).

По словам моего учителя, это очень, очень плохая и незавершенная практика.

Действительно ли разрыв из цикла - это не выполненная практика?

Спасибо

Ответы [ 7 ]

6 голосов
/ 31 марта 2011

Прекрасно разрывать или возвращать из цикла.

То, что ваш учитель, вероятно, относится к классическому , функция должна иметь только одну точку возврата , расширенную до циклов. Основанием для этого является то, что ваш поток управления всегда должен быть максимально простым и понятным. Это не строгое правило, что вы должны подчиняться, не задумываясь.

Чтобы переписать ваш образец без использования break и return:

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

  return $ret;
}

Больно читать и поддерживать. Твой более краткий.

1 голос
/ 01 апреля 2011

Некоторые подходы к проектированию программ, такие как Джексон , не очень дружат с разрывом циклов.Это довольно академический аргумент, который в действительности не используется в реальной жизни.

1 голос
/ 31 марта 2011

Не думаю, что это будет плохая практика. Такие вещи, как разрыв цикла или использование возврата в цикле, - это просто вещи, которые не следует делать небрежно.

Когда я был новичком, я всегда слышал эти вещи. Не используйте это или не используйте это. Но позже я понял, что они говорят это только для того, чтобы новички не допустили ошибок, используя эти вещи небрежно. И люди, которые не осознают этого, а потом сами станут учителями, будут держать вас подальше от них, потому что они были чем-то злым.

Так что да, используйте это, иногда это очень и очень удобно. Просто отметьте все вещи, о которых вы должны заботиться при их использовании, как уже упоминали другие. Узнайте, когда вы не должны их использовать.

( Еще одна вещь: получение размера массива в условии цикла действительно считается плохой практикой. Вы не хотите получать размер на каждой итерации.

Вместо:

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

Использование:

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

)

1 голос
/ 31 марта 2011

Я бы держался подальше от разрывов в петлях, если это возможно. Если ваш цикл становится больше, его становится все труднее читать. Любой, кто не знаком с вашим кодом или этой конкретной функцией, предположит, что ваш цикл повторяется по всему массиву, просто взглянув на первую строку. Делать что-либо еще - «удивительно» и, таким образом, нарушать «Принцип наименьшего удивления» из философии 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 голосов
/ 31 марта 2011

Люди обычно говорят, что использование break или continue (или их эквивалентов) - это плохо. Я все равно их использую: -P

Другой способ сделать это - обернуть весь код в if или else.

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;
}
0 голосов
/ 31 марта 2011

Я не считаю плохой практикой разрывать петли.Однако я обычно делаю это, используя break или continue, в зависимости от ситуации.

0 голосов
/ 31 марта 2011

Нет ничего плохого в разрыве циклов.Это похоже на очень ограниченный гото.Не заботьтесь о своем учителе: -)

...