更好的结构/新关键字方式

aro*_*onp 4 c++ java

前段时间我遇到了以下我很少见过的构造,虽然我比较频繁地使用它.我通常在检查整个条件列表时使用它,并且它可以防止大量缩进.基本上它使用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)

  • 我正在流血拍摄我使用该循环结构的任何程序员;) (10认同)
  • OMG非常认真,除非我完全错过了一些东西,否则他只是以最混乱的方式编写if(condition1 && condition2 && condition3){doSomething()}? (3认同)

jal*_*alf 7

您可能已经听说过现代编程语言所具有的这些东西,称为函数 ;)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)

有很多方法可以表达这一点,没有违反直觉的循环 - 不要循环.