3

假设您有以下代码:

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

  return false;
}

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

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

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

谢谢

4

7 回答 7

6

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

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

break要在不使用and的情况下重写您的示例return

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

  return $ret;
}

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

于 2011-03-31T14:33:14.357 回答
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;
}
于 2011-03-31T14:44:48.080 回答
1

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

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

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

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

代替:

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

采用:

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

)

于 2011-03-31T14:49:32.810 回答
1

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

于 2011-04-01T15:12:16.693 回答
0

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

于 2011-03-31T14:32:54.183 回答
0

我不认为打破循环是一个坏习惯。但是,我通常根据情况使用breakor来完成。continue

于 2011-03-31T14:33:09.173 回答
0

人们通常说使用breakcontinue(或它们的等价物)是不好的。无论如何我都会使用它们:-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从循环中 ing 的情况下。我建议您在循环外设置一个变量,在需要时中断循环,然后返回该变量。

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

  return $ret;
}
于 2011-03-31T14:34:09.207 回答