前段时间我遇到了以下我很少见过的构造,虽然我比较频繁地使用它.我通常在检查整个条件列表时使用它,并且它可以防止大量缩进.基本上它使用for循环来提供一种结构化的goto.我的问题首先是否有更好的方法来构建它,其次是人们是否喜欢它,第三是java/c ++中的新关键字(例如unit {})是否只会导致中断退出到单元的末尾有用而且更清晰.
ps我意识到它远离无限循环,但我认为我对此的偏执意味着它从未发生过.
编辑:我已经为其他条件添加了一些设置代码,以尝试用链接来解决问题
boolean valid = false;
// this loop never loops
for (;;)
{
if (!condition1)
break;
condition2.setup();
if (!condition2)
break;
condition3.setup();
if (!condition3)
break;
valid = true;
break;
}
if (valid) dosomething();
Run Code Online (Sandbox Code Playgroud)
编辑:
我刚刚发现,实际上有一种方法可以在java中构造它而不会滥用循环等,并且想知道这是否会同样令人不满,尽管我猜我错过了这个.
重构的代码看起来像这样.
boolean valid = false;
breakout:
{
if (!condition1)
break breakout;
condition2.setup();
if (!condition2)
break breakout;
condition3.setup();
if (!condition3)
break breakout;
valid = true;
}
if (valid) dosomething();
Run Code Online (Sandbox Code Playgroud)
现在,这消除了导致很多抱怨的for循环的误用,并且实际上是一个解决方案,我认为是非常整洁的,并且是我原本想要找到的.我猜这个结构可能并不为人所知,因为没有人提到它,人们强烈反对这个?
Ste*_*end 16
这个循环是反直觉的,在代码审查中会受到质疑:"如果你总是在第一次迭代中破解,为什么还需要一个循环呢?"
为什么不用这个?
boolean valid = true;
if (!condition1)
valid = false;
else if (!condition2)
valid = false;
else if (!condition3)
valid = false;
if (valid) dosomething();
Run Code Online (Sandbox Code Playgroud)
您可能已经听说过现代编程语言所具有的这些东西,称为函数 ;)goto不再使用的一个关键原因是我们现在可以将代码分解为单独的函数,而是调用它们.
为您解决问题的一种方法是将代码放在一个单独的函数,而是和返回,而不是从伪开断:
void safedosomething() {
if (!condition1)
return;
condition2.setup();
if (!condition2)
return;
condition3.setup();
if (!condition3)
return;
dosomething();
}
Run Code Online (Sandbox Code Playgroud)
或编写辅助函数(如bool checkcondition1() { condition1.setup(); return condition1; })设置然后测试条件,并使用布尔标志:
bool valid = true;
if (!checkcondition1())
valid = false;
if (!checkcondition2())
valid = false;
if (!checkcondition3())
valid = false;
if (!checkcondition4())
valid = false;
if (valid) dosomething();
Run Code Online (Sandbox Code Playgroud)
或者更简洁一点:
bool valid = true;
valid &&= checkcondition1();
valid &&= checkcondition2();
valid &&= checkcondition3();
valid &&= checkcondition4();
if (valid) dosomething();
Run Code Online (Sandbox Code Playgroud)
要不就
if (checkcondition1()
&& checkcondition2()
&& checkcondition3()
&& checkcondition4())
dosomething();
Run Code Online (Sandbox Code Playgroud)
有很多方法可以表达这一点,没有违反直觉的循环 - 不要循环.
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |