打破循环

时间:2011-03-31 14:30:59

标签: language-agnostic for-loop control-structure

假设你有这段代码:

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

  return false;
}

请注意,我不是在谈论特定于PHP(这适用于所有语言)或此特定示例。它是关于打破for循环(在这种情况下,返回true;停止循环)。

根据我的老师的说法,这是非常非常糟糕的,也是一种没有做过的练习。

从一个循环中脱离真的是一个没做过的练习吗?

由于

7 个答案:

答案 0 :(得分:6)

从循环中断或返回是完全正常的。

老师可能提到的是经典一个函数应该只有一个返回点扩展到循环。这背后的基本原理是,您的控制流程应始终尽可能简单易懂。你不必不加思索地遵守这个规则并不严格。

在不使用breakreturn的情况下重写样本:

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

  return $ret;
}

阅读和维护是痛苦的。你的话更简洁。

答案 1 :(得分: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;
}

答案 2 :(得分:1)

我认为这不是一个坏习惯。这些类型的东西,比如打破一个循环,或者在循环中使用return,这些都是不应该不小心完成的事情。

当我是初学者时,我总是听到这些事情。不要使用它,或不使用它。但后来我意识到他们只是这样说,以防止新来者不小心使用这些东西犯下错误。那些没有意识到这一点,后来成为老师的人会让你远离这些,因为他们是邪恶的东西。

所以是的,使用它,有时非常方便。请注意使用这些内容时需要注意的所有事项,正如其他人在此提到的那样。了解何时不应使用它们。

另外一件事:在循环条件下获取数组的维度确实被认为是不好的做法。你不想在每次迭代时获得大小。

而不是:

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

使用:

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

答案 3 :(得分:1)

Jackson这样的程序设计方法实际上并不是打破循环的朋友。这是一个相当学术性的论点,在现实生活中并没有真正遵循。

答案 4 :(得分:0)

打破循环没什么不好。这就像一个非常有限的goto。不要关心你的老师: - )

答案 5 :(得分:0)

我认为打破一个循环不是一个坏习惯。但是,我通常会使用breakcontinue来执行此操作,具体视具体情况而定。

答案 6 :(得分: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;
}