【问题标题】:break in for loop闯入 for 循环
【发布时间】:2011-03-31 14:30:58
【问题描述】:

假设你有这个代码:

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

  return false;
}

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

据我的一位老师说,这是非常非常糟糕的做法。

打破循环真的是一种未完成的做法吗?

谢谢

【问题讨论】:

  • 你的老师有没有为他的陈述提供任何理由?

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


【解决方案1】:

中断或从循环返回完全没问题。

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

在不使用breakreturn 的情况下重写您的示例:

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

  return $ret;
}

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

【讨论】:

  • 当然,函数也有相反的学说:早破(返回)的规则。这意味着您的代码的主要流程不会缩进很多,因此易于遵循,并且所有违反您的主要流程的条件都堆叠在顶部。
  • 感谢您的回答。老师并不是说要在多个点返回,因为她说“除了在 switch 语句中之外,永远不要使用 break”。她还谈到了多个返回点,但是,她并没有对此提出什么大问题,而她谈到了循环中断是有史以来最糟糕的事情之一。
  • 那是垃圾。编写易于阅读和维护的代码。保持控制流尽可能简单。如果你完成了你开始循环的工作break它。如果您完成了整个功能(包括清理),请从它那里获得return。就是这样。
【解决方案2】:

如果可能的话,我会远离循环中断。如果你的循环变得更大,它变得越来越难以阅读。任何不熟悉您的代码或该特定函数的人都会假设您的循环仅通过查看第一行就遍历整个数组。做任何其他事情都是“令人惊讶的”,因此打破了 CleanCode 哲学中的“最小惊讶原则”。如果您有多个退出循环的条件,那么 for 循环不是您应该寻找的。这就是 while 循环的用途。

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

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

    return $found;
}

【讨论】:

  • 在某些情况下,while 无疑是最佳解决方案。但是如果你可以使用一个简单的foreach,里面有一个中断条件,break 听起来并不难读……
  • 有两种循环(短的,如上面的一种和复杂的)。对于像上面这样短且便宜的循环,while 循环在某种程度上超过了顶部,就像中断一样。只需使用 foreach 并完成它。复杂的(和更昂贵的)循环带来了可读性的争论。在 if 或 else 子句中散布在代码中的一个或多个中断的循环很难阅读,应该避免使用 while 循环的地方。
  • 一个更复杂的循环也不一定是一个昂贵的循环。
【解决方案3】:

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

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

所以是的,使用它,它有时非常方便。正如其他人在这里提到的那样,请注意使用这些时您必须关心的所有事情。了解何时不应使用它们。

(还有一件事:在循环条件下获取数组的维度确实被认为是不好的做法。您不想在每次迭代时都获取大小。

代替:

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

用途:

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

)

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        我不认为打破循环是一个坏习惯。不过,我通常会根据情况使用breakcontinue

        【讨论】:

          【解决方案7】:

          人们通常说使用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
              }
            }
          }
          

          returning 来自循环的情况下。我建议你在循环外设置一个变量,在需要的时候打破循环,然后返回变量。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-04-19
            • 1970-01-01
            • 1970-01-01
            • 2011-09-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多