编程首选项 - 使用具有多个return语句的else ifs?

Sam*_*ird 9 java language-agnostic preferences

代码:

public String getTemperatureMessage(double temp)
{
    if(temp < 32)
        return "Freezing";
    else if(temp < 60)
        return "Brr";
    else if(temp < 80)
        return "Comfortable";
    else
        return "Too hot";
}
Run Code Online (Sandbox Code Playgroud)

关于上面的代码片段,else ifs在技术上是多余的,并且根本不会改变行为.但是,我倾向于把它们放在那里强调条件是排他性的.你的想法是什么?不必要或更清楚?

Bal*_*usC 10

在这种特殊情况下唯一可行的替代方法是获取条件运算符?:.

public String getTemperatureMessage(double temp) {
    return temp < 32 ? "Freezing"
         : temp < 60 ? "Brr"
         : temp < 80 ? "Comfortable"
         : "Too hot";
}
Run Code Online (Sandbox Code Playgroud)

留下问题,这对初学者来说是多么可读.

参考

相关问题

  • 那是我见过的最丑陋的三元句 (5认同)
  • 哈酷!我不喜欢它,但它很聪明! (4认同)

Ste*_*nne 9

这取决于许多事情,比如你的代码有多复杂.通过这样一个简单的例子,我将返回与ifs放在同一行,而不是使用elses.结构和行为很明确:

public String getTemperatureMessage(double temp)
{
    if(temp < 32) return "Freezing";
    if(temp < 60) return "Brr";
    if(temp < 80) return "Comfortable";
    return "Too hot";
}
Run Code Online (Sandbox Code Playgroud)

当我有更复杂的代码时,我发现不使用返回或继续/中断从嵌套中突破,而是分配给状态或结果变量是有用的.然后,我将包括{},即使该块是单个语句,主要是为了保持结构在代码中的表示方式的一致性,还要稍微降低后续编辑将忘记将语句更改为块的风险.

如果这个例子更复杂,我可能会像这样编码:

public String getTemperatureMessage(double temp) {
    String result;
    if(temp < 32) {
        result = "Freezing";
    } else {
        if(temp < 60) {
            result = "Brr";
        } else {
            if(temp < 80) {
                result = "Comfortable";
            } else {
                result = "Too hot";
            }
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)


sup*_*cat 8

如果函数有多个"成功"返回值,我将使用if/else在它们中进行选择.如果一个函数具有正常的返回值,但是一个或多个可能异常退出的方法,我通常不会对正常路径使用"else".例如,我认为说"自然"更为"自然":

int do_something(int arg1)
{
  if (arg1 > MAX_ARG1_VALUE)
    return ARG1_ERROR;
  ... main guts of code here
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

而不是说:

int do_something(int arg1)
{
  if (arg1 > MAX_ARG1_VALUE)
    return ARG1_ERROR;
  else
  {
    ... main guts of code here
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

要么

int do_something(int arg1)
{
  if (arg1 <= MAX_ARG1_VALUE)
  {
    ... main guts of code here
    return 0;
  }
  else
    return ARG1_ERROR;
Run Code Online (Sandbox Code Playgroud)

如果存在可能"出错"的多种事物,则这种区别变得尤为重要

int do_something(int arg1)
{
  if (arg1 > MAX_ARG1_VALUE)
    return ARG1_ERROR;
  ... some code goes here
  if (something_went_wrong1)
    return SOMETHING1_ERROR;
  ... more code goes here
  if (something_went_wrong2)
    return SOMETHING2_ERROR;
  ... more code goes here
  if (something_went_wrong3)
    return SOMETHING3_ERROR;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下嵌套的"if/else"语句会变得很难看.这种方法最重要的警告是必须明确给出早期退出的任何清理代码,否则必须使用包装函数来确保清理.


Col*_*ert 7

有人会说多重回报就是这里的问题.但这不是我的观点.

对于我的观点,if/else if非常重要,因为即使在你的情况下你返回了一些值,删除elses也意味着你无论如何都不会放它们,这意味着完全不同的东西,如果回报不在这里.

另外,想象有一天有人想要编辑你的代码,并清理它以便一次返回,这个人可能会误解你的代码并犯下这样一个严重的错误:

public String getTemperatureMessage(double temp){
    String message;
    if(temp < 32)
        message = "Freezing";
    if(temp < 60)
        message = "Brr";
    if(temp < 80)
        message = "Comfortable";
    else 
        message = "Too hot";
    return message;
}
Run Code Online (Sandbox Code Playgroud)

为了澄清我的观点,保留其余部分,保持代码清晰.

  • @Recurse,阅读我的帖子和OP帖子!他问elses是否有用,我说的是一个例子,为什么!(你一定是在开玩笑,有人真的读过这个问题吗?) (3认同)
  • +1:因为当他们真的根本就没读过时,其他人似乎都在贬低你.:d (2认同)