Language agnostic 环路中断

Language agnostic 环路中断,language-agnostic,for-loop,control-structure,Language Agnostic,For Loop,Control Structure,假设您有以下代码: function doSomething($array) { for($i = 0; $i < sizeof($array); $i++) { if ($array[$i] == "ok") return true; } return false; } 函数doSomething($array) { 对于($i=0;$i

假设您有以下代码:

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

  return false;
}
函数doSomething($array)
{
对于($i=0;$i
请注意,我不是在谈论特定于PHP的(这适用于所有语言)或这个特定的示例。它是关于在for循环中中断(在本例中,返回true;停止循环)

据我的一位老师说,这是一个非常非常糟糕的做法,而且没有完成

打破循环真的是一种未完成的练习吗


谢谢

打断循环没有什么不好的。这就像是一个非常有限的转到。不要在意你的老师:-)

我不认为打破循环是一种不好的做法。但是,我通常使用
中断
继续
,这取决于具体情况。

中断循环或从循环返回完全可以

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

要在不使用
break
return
的情况下重写示例,请执行以下操作:

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

  return $ret;
}
函数doSomething($array)
{
$ret=假;
对于($i=0;$i

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

人们通常说使用
break
continue
(或其等价物)是不好的。我还是用它们

另一种方法是将所有代码包装在
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
    }
  }
}

如果可能的话,我会远离环路中的断点。如果你的循环越来越大,阅读起来就越来越困难。任何不熟悉您的代码或特定函数的人都会认为,只要看第一行,您的循环就会遍历整个数组。做任何其他事情都是“令人惊讶的”,因此打破了干净代码哲学中的“最少惊讶原则”。如果您有多个退出循环的条件,那么for循环就不是您应该寻找的。这就是while循环的用途

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

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

    return $found;
}
函数doSomething($array){
$found=false;
$i=0;
而($i
我不认为这是一种不好的做法。这些类型的事情,比如打破循环,或者在循环中使用返回,都是不应该粗心大意的事情

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

所以,是的,使用它,它有时非常方便。正如其他人所提到的,在使用这些工具时,请注意所有需要注意的事项。学习什么时候不应该使用它们

还有一件事:在循环的条件下获取数组的维数被认为是一种糟糕的做法。您不希望每次迭代都获取数组的大小

而不是:

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

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

)

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

当然,函数也有相反的原则:提前打破(返回)规则。这意味着您的代码的主流不会非常缩进,因此易于遵循,并且所有违反主流的条件都堆叠在顶部。谢谢您的回答。这位老师并没有谈论在多个点返回,因为她说“除了在switch语句中,永远不要使用break”。她还谈到了多个返回点,然而,她并没有对此提出太大的问题,而她谈到打破循环是有史以来最糟糕的事情之一。那是垃圾。编写易于阅读和维护的代码。使控制流尽可能简单。如果您已完成启动循环的作业,请中断它。如果完成了整个函数(包括清理),
从中返回。就是这样。你的老师为他的陈述提供了任何理由吗?在某些情况下,
无疑是最好的解决方案。但是,如果你可以使用一个简单的
foreach
,里面有一个单独的中断条件,
break
听起来并不是不可读的……有两种循环(短循环,如上面的循环和复杂循环)。对于像上面这样短而便宜的循环,while循环在某种程度上超过了顶部,就像中断一样。只要使用foreach,就可以了。复杂(且更昂贵)的循环带来了可读性的争论。代码中分散着if或else子句的一个或多个中断的循环很难读取,应该避免while循环的出现。更复杂的循环也不一定是昂贵的循环。
for($i = 0; $i < sizeof($array); $i++)
$size=sizeof($array);
for($i = 0; $i < $size; $i++)