if (condition1)
{
return;
}
else
{
...
if (condition2)
{
return;
}
else
{
...
}
}
VS
if (condition1) return;
...
if (condition2) return;
...
即使else
返回,我通常也会包含if
,但我会一直忽略它。我意识到它不是必需的,所以离开else
实际上更清楚了吗?是否有风格上的共识?
如果上面的嵌套结构后面有很多if/else
个子句,那么执行时间是否会有显着差异?
答案 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
}