3 回答
TA贡献1827条经验 获得超8个赞
我不会说这很糟糕 -但同样地,我通常至少会寻找另一种选择。
在我写第一件事的情况下,我几乎总是至少尝试将其重构为更清晰的内容。有时它是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,您需要仔细查看块的其余部分以检查是否存在是不是经过了else可能会出现的块是否running已经被设置为false与否。
该break语句可以更清楚地传达意图,并让块的其余部分继续进行所需的操作,而不必担心较早的条件。
请注意,这与人们在一个方法中拥有多个return语句的说法完全一样。例如,如果我可以在前几行中得出方法的结果(例如,因为某些输入为空,为空或为零),那么发现直接返回该答案要比使用变量存储结果更清楚,然后是一整段其他代码,最后是一条return语句。
TA贡献1875条经验 获得超3个赞
AFAIK没什么,真的。老师只是对过敏goto,因为他们听到某处情况确实很糟糕。否则,您将只写:
bool guard = true;
do
{
getInput();
if (something)
guard = false;
} while (guard)
几乎是同一回事。
也许这更干净(因为所有循环信息都包含在块的顶部):
for (bool endLoop = false; !endLoop;)
{
}
添加回答
举报