如果返回,是否应该省略?

时间:2014-03-27 20:05:57

标签: if-statement language-agnostic

if (condition1)
{
    return;
}
else
{
   ...
   if (condition2)
   {
       return;
   }
   else
   {
       ...
   }
}

VS

if (condition1) return; ... if (condition2) return; ...

即使else返回,我通常也会包含if,但我会一直忽略它。我意识到它不是必需的,所以离开else实际上更清楚了吗?是否有风格上的共识?

如果上面的嵌套结构后面有很多if/else个子句,那么执行时间是否会有显着差异?

5 个答案:

答案 0 :(得分:3)

如果您遵循"单一归还原则" (请参阅this question和其他人),然后return块中永远不会if

如果你不是,那么在我看来,这是个人偏好的问题,也取决于具体情况。基本上我试着做最清楚的事情。一般来说,我包括其他因为它更清楚,但有时候我赢了;这里有一个例子,说明包含else条款似乎浪费(而不是更清楚):

bool test_three_things( /*some input...*/ )
{
    if ( /*first test...*/ )
      return false;

    if ( /*second test...*/ )
      return false;

    if ( /*third test...*/ )
      return false;

    return true;
}

在这种情况下,它清楚了解了什么。但是,如果我在较大的代码块的上下文中编写单个if,我通常会包含else

答案 1 :(得分:0)

这实际上是一个基于个人意见的问题。没有正确的答案。每个人都以自己喜欢的方式做到这一点。我首选的方法是尽早检查无效病例。这样代码保持较少的缩进和可读性。我通常用它来验证输入参数。所以我的首选方式是 -

if (condition1)
{
    // this is invalid case for me, return
    return;
}

if (condition2)
{
    // this is also invalid case for me, return
    return;
}

// My actual work with the valid cases goes here

遵循非常深的if...else模式并没有任何明显的改进。

答案 2 :(得分:0)

采取这种方式

你带着口袋里的钱去商店只购买少于100美元的巧克力,否则你会买衣服。所以,如果和其他放松限制。你可以买两者之间。 另一方面,如果你去市场购买巧克力,那么你只有很多选择,所以只有更多的限制。 根据此示例,您可以在代码中确定所需内容。

答案 3 :(得分:0)

这取决于。一点点。

对于琐碎的案例,我会经常保持else明显的并行性:

def foo(arg1, arg2):
    if condition:
        return arg1
    else:
        return arg2

但是对于任何远程复杂的事情,我会放弃else,并且通常会建议其他人也这样做。这是因为跟这样的函数真的很难:

def foo():
    if cond1:
        # ten lines here
        return value
    else:
        if cond2:
            # another ten lines
            return value
        else:
            if cond3:
                # ten more lines
                return value

            # ...a couple dozen lines here...

    return value

说我想重构这个函数,或者一些使用它的代码,我想知道如何计算返回值,因为有人忘记编写文档。我看到的第一件事是三个单独的if,其中包含一堆代码,现在看起来有{8}个可能发生的八种不同的组合,谁知道如何每个value的路径都很多,我叹了口气,喝了一大杯伏特加,然后去弄清楚它们是什么。

更糟糕的是,假设每个return阻止有条件的每个if

另一方面,即使有更多条件,这也很容易理解:

return

这会有多少种方法?四,它们显然是相互排斥的,def foo(): if cond1: # ten lines here return value if cond2: # another ten lines return value if cond3: # ten more lines return value # ...a couple dozen lines here... return value 甚至可以直观排列。

嵌套块读取指数复杂性。顺序块读取就像一系列步骤,更像是你想传达的内容。

最终,我认为保持return 尽可能缩进是对单一回归原则精神的良好妥协,我从不打算遵循。< / p>

是的,我已经重构了这样的代码:)

答案 4 :(得分:-1)

看,当return返回它调用的当前函数时,return语句下面的所有代码都将被忽略。

在return语句之后执行的唯一代码是位于finally中的代码,如下所示:

try{
    if(condition == true)
    {
        return;
    }
}
finally{
    //Code here will run too
}