当您在if-else链中提供每个可能的结果时,正确的格式是什么?

时间:2014-10-14 16:24:29

标签: conventions

我用Java来问这个问题,但它也适用于遵循类似编译器模式的其他语言。

这适用于您提供所有可能结果的任何类型的方法,但我将使用boolean方法作为示例。我列出了两种编码方法的方法:

示例1:

public boolean example1(final int value1, final int value2) {
    if (value1 == value2) {
        //do something 1
        return true;
    } else if (value1 < value2) {
        //do something 2
        return false;
    } else if (value1 > value2) {
        //do something 3
        return false;
    } //could also be in an "else" block.
    return false; //impossible to reach, but necessary to compile.
}

肯定:

  1. 允许该方法的未来查看者立即确定该方法的确切功能。
  2. 否定

    1. 有点&#34; hacky&#34;,几乎不洁净。
    2. 示例2:

      public boolean example2(final int value1, final int value2) {
          if (value1 == value2) {
              //do something 1
              return true;
          } else if (value1 < value2) {
              //do something 2
              return false;
          } else { //The same as (value1 > value2)
              //do something 3
              return false;
          }
      }
      

      肯定:

      1. 不清楚该方法的作用。 (尽管可以通过适当的文档来防止这种情况)
      2. 否定

        1. 该方法的作用并不明显。
        2. 其他人,至少对我来说,可能意味着唯一重要的比较是第一次2.毕竟,其他意味着&#34;其他一切&#34;,这可能会误导和/或混淆。
        3. 这些方法完全相同。但是,我相信示例1比示例2更容易阅读,因为它明确地说明了if-else链中的最后一个if语句。与此同时,由于缺乏一个更好的词,示例1对我来说非常肮脏。

          有没有正确的方法来做到这一点,还是只是个人偏好?

          编辑:我选择不包含一组if语句(不在if-else链中),因为我知道这不是一个好方法。如果有人不同意这一点并且有充分理由这样做,请在下面发布,我将修改我的问题。

          编辑2:这种观点的原因是因为&#34;做某事&#34;例如,100多行代码,没有if-else链会大大降低可读性。简而言之,&#34;做某事&#34;只有一行或几行代码,然后是,这可能是可行的。出于这个原因,我将在下面添加它作为第三个例子(尽管我仍然认为它不具有可读性,但这是个人偏好。)

          示例3:

          public boolean example1(final int value1, final int value2) {
              if (value1 == value2) {
                  //do something 1
                  return true;
              }
              if (value1 < value2) {
                  //do something 2
                  return false;
              }
              //do something 3
              return false;
          }
          

          肯定:

          1. 当做某事时,(对某些人来说)更容易阅读&#34;只有几行代码。
          2. 删除技术上多余的&#34;否则&#34;语句。
          3. 否定

            1. 在做某事的情况下更难以阅读&#34;是几百行代码。
            2. 做&#34;做点什么3&#34;在if语句之外,乍一看表明该行将始终运行,直到在前面的if语句中注意到return语句。
            3. 示例4(以及我个人最喜欢的):

              public boolean example1(final int value1, final int value2) {
                  if (value1 == value2) {
                      //do something 1
                  } else if (value1 < value2) {
                      //do something 2
                  } else if (value1 > value2) {
                      //do something 3
                  }
                  return value1 == value2;
              }
              

              这很棒,因为它会照顾&#34;做某事&#34;首先,然后将return语句限制在一个单独的,干净的,易于阅读的语句中,没有&#34; hacky&#34;反响。

4 个答案:

答案 0 :(得分:3)

正如您所指出的,这是一个偏好问题。第一个例子中的第三个if是多余的,一些IDE甚至会警告它 就个人而言,我会选择第二个,因为我鄙视编写冗余的代码,但这一切都归结为项目标准和个人偏好。

编辑:
实际上,如果我们谈论的是个人偏好,我会完全删除else - 如果你输入if阻止你只是return的功能,那么{{ 1}}和else if是多余的:

else

答案 1 :(得分:1)

示例2要好得多。在示例1中,系统必须经过另一组“验证”,而在示例2中,在2次验证之后,它将继续执行默认操作。

因此,示例2中的操作至少减少了一次。

答案 2 :(得分:1)

选项3是

public boolean example2(final int value1, final int value2) {
    if (value1 == value2) {
        //do something 1
        return true;
    }

    if (value1 < value2) {
        //do something 2
        return false;
    }

    //The same as (value1 > value2)
    //do something 3
    return false;
}

换句话说,如果在每个块的末尾有一个else语句,并且它清楚它正在做什么,那么你真的不需要return

当代码块非常短时,我更喜欢这个。如果它们很长,则很难注意到return语句。

答案 3 :(得分:1)

就个人而言,我只是在有意义时只有一个return陈述的粉丝。对于您的代码,我认为确实如此。所以,我会用......

选项3:

public boolean example1(final int value1, final int value2) {
    if (value1 == value2) {
        //do something 1
    } else if (value1 < value2) {
        //do something 2
    } else if (value1 > value2) {
        //do something 3
    }
    return value1 == value2;
}

这个特殊的结构并不总是有意义的,但是因为你总是回归value1 == value2,我认为它会稍微清楚一点,只能在最后做一次。

对于任何出现并浏览代码的人来说,将会发生的事情非常清楚。该方法总是在具有相同值的相同位置完成,并且在此之前有一些简单的工作流逻辑。