是“while(true)”循环如此糟糕?

问题:

我已经在Java编程了几年了,但我刚刚回到学校获得正式学位。我非常惊讶地发现,在我最后的作业中,我失去了使用下面的循环的点数。

do{
     //get some input.
     //if the input meets my conditions, break;
     //Otherwise ask again.
} while(true)

现在我的测试我只是扫描一些控制台输入,但我被告知,这种循环是不鼓励的,因为使用break类似于goto,我们只是不这样做。
我完全理解了goto及其Java表弟break:label的陷阱,我很有意义不要使用它们。我也意识到,一个更完整的程序将提供一些其他的逃生途径,例如说结束程序,但这不是我的教授引用的原因,所以…
do-while(true)有什么问题

回答:

我不会说这是bad – 但同样地,我通常至少会寻找一个替代方案。
在这是我写的第一件事情的情况下,我几乎总是至少将try重构成更清晰的东西。有时它不能被帮助(或者替代方法是有一个没有意义的bool变量,除了指示循环的结尾,不如break语句清楚),但至少值得尝试。
作为使用break比标志更清楚的一个例子,请考虑:

while (true)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        break;
    }
    actOnInput(input);
}

现在我们强制它使用一个标志:

boolean running = true;
while (running)
{
    doStuffNeededAtStartOfLoop();
    int input = getSomeInput();
    if (testCondition(input))
    {
        running = false;
    }
    else
    {
        actOnInput(input);
    }
}

我认为后者更复杂:它有一个额外的else块,actOnInput更缩进,如果你想弄清楚testCondition返回true会发生什么,你需要仔细看看块的其余部分,以检查是否running已被设置为false而不会发生else else块{}。
break语句更清楚地传达意图,并让其余的块获得所需要做的,而不用担心早期的情况。
请注意,这与人们对方法中的多个返回语句有着一样的争论。例如,如果我可以计算出前几行中的方法的结果(例如,因为某些输入为空,或为空,否则为零),我发现直接返回该答案更清楚,而不是具有存储结果的变量,然后是整个其他代码块,finally一个return语句。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Are “while(true)” loops so bad?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

7 + 2 =