2011-03-31 182 views
3

假设你有这样的代码:打破了循环

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

    return false; 
} 

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

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

从循环中打破真的是一个未完成的实践?

谢谢

+1

你的老师是否提供了他的陈述的任何理由? – 2011-03-31 14:48:54

回答

6

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

你的老师可能指的是经典的函数应该只有一个返回点扩展为循环。这背后的基本原理是,你的控制流程应该尽可能简单易懂。这不是一个严格的规则,你必须服从而不思考。

要重写你的样品,而无需使用breakreturn

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

    return $ret; 
} 

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

+1

当然,功能也有相反的学说:早期打破(返回)的规则。这意味着代码的主流不会缩减,因此易于遵循,并且违反主流的所有条件都会堆叠在顶部。 – 2011-03-31 14:38:01

+0

谢谢你的回答。老师并没有谈论多点回归,因为她说“除了在开关语句之外,不要使用休息时间”。她还谈到了多个回报点,但是,她并没有遇到大问题,但她谈论的是循环中断是有史以来最糟糕的事情之一。 – Bv202 2011-03-31 14:42:40

+4

这是垃圾。编写易于阅读和维护的代码。尽可能保持控制流畅。 如果你已经完成了开始循环*的工作,请打断它。如果你完成了整个功能(包括清理),从它返回。而已。 – 2011-03-31 14:49:37

0

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

0

我不认为这是一个打破循环的坏习惯。但是,我通常通过使用breakcontinue来完成,具体取决于具体情况。

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; 
} 
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; 
} 
+0

这是做到这一点的一种方式,但是我认为代码比我的复杂得多.. – Bv202 2011-03-31 14:53:38

+0

在某些情况下,'while'肯定是最好的解决方案。但是,如果你可以在内部使用一个简单的'foreach',那么'break'不会听起来有些不可读... – kapa 2011-03-31 15:01:08

+0

有两种循环(短的,如上面的那些和复杂的)。由于循环如上所述短而且便宜,while循环在某种程度上超过顶部,因此是休息时间。只需使用foreach并完成它。随着复杂(和更昂贵的)循环来的可读性的论点。在代码中散布的if或else子句中有一个或多个break的循环很难阅读,应该避免while循环进入的地方。 – Nicktar 2011-03-31 15:11:18

1

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

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

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

一两件事:。得到数组的循环中的条件维度被认为是不好的做法的确是你不想要得到每次迭代的大小

相反的:

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

用途:

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

1

Jackson这样的一些程序设计认证并不真正成为破环的朋友。这是一个颇具学术性的论点,在现实生活中并没有真正遵循。