java - 重构 (C) 伪代码以删除 goto

标签 java c goto

<分区>

在 Java 中对此进行重构的最佳实践是什么?

while (1) {
  // initialisation

  for (int i = 0; i < MAX_ATTEMPT; i++) {
    if (try_something()) goto step2;
  }
  continue;

step2:  
  for (int i = 0; i < MAX_ATTEMPT; i++) {
    if (try_next_thing()) goto step3;
  }
  continue;

step3:
  ...
}    

最佳答案

您首先要确定代码试图完成什么:

  • 反复执行以下操作:
  • 调用 try_something() 最多 MAX_ATTEMPT 次,如果它从未返回 true,则重新启动。
  • 调用 try_next_thing() 最多 MAX_ATTEMPT 次,如果它从未返回 true,则重新启动。

然后,编写执行此操作的代码,例如:

while (true) {

    int i;

    for (i = 0; i < MAX_ATTEMPT && !try_something(); ++ i)
        ;
    if (i == MAX_ATTEMPT)
        continue;

    for (i = 0; i < MAX_ATTEMPT && !try_next_thing(); ++ i)
        ;
    if (i == MAX_ATTEMPT)
        continue;

    // etc.

}

还有很多其他方式可以表达这一点。例如,您可以将每个步骤分解为一个方法,并利用 && 将在参数为假时停止计算它的参数这一事实:

boolean doFirstThing () {
    int i;
    for (i = 0; i < MAX_ATTEMPTS && !try_something(); ++ i)
        ;
    return i < MAX_ATTEMPTS;
}

boolean doSecondThing () {
    int i;
    for (i = 0; i < MAX_ATTEMPTS && !try_other_thing(); ++ i)
        ;
    return i < MAX_ATTEMPTS;
}

// then, elsewhere
while (true)
    doFirstThing() && doSecondThing();

或者其他什么。我不确定我是否会将后者称为“最佳实践”,因为它有点混淆(这并不是说它在某些情况下不合适),但这只是一个例子。一般来说,当移植到另一种语言时:Analyze original -> what is it supposed to do? -> 用目标语言重新实现。优先考虑的是代码的正确性,其次(但紧随其后)是清晰度。

关于java - 重构 (C) 伪代码以删除 goto,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18076134/

相关文章:

java - JAXB 2 - Java EE 5 和 Java EE 6 之间的变化

java - 使用ConfigurationProperties构建Java POJO Map

通过 C 中的 SO 更改内存中的值

Windows 批处理转到 FOR 循环内

java - Jar(使用gradle任务生成)中的Java文件无法在工作空间中访问

java - SQL查询: incorrect work with entity

c++ - 是否有一个很好的 Unix 命令来转储二进制文件的文本表示?

c - getpwnam 的奇怪行为

java - 如何在不同的代码段之间跳转?

c++ - 跳过变量初始化格式不正确还是会导致不确定的行为?