在C,C++和C#使用条件时函数或循环语句中有可能使用继续或返回尽早声明,摆脱了其他的分支的if-else语句.例如:
while( loopCondition ) {
if( innerCondition ) {
//do some stuff
} else {
//do other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
变
while( loopCondition ) {
if( innerCondition ) {
//do some stuff
continue;
}
//do other stuff
}
Run Code Online (Sandbox Code Playgroud)
和
void function() {
if( condition ) {
//do some stuff
} else {
//do other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
变
void function() {
if( condition ) {
//do some stuff
return;
}
//do other stuff
}
Run Code Online (Sandbox Code Playgroud)
如果if-else分支很长,则"after"变体可能更具可读性,因为此更改消除了else分支的缩进.
是这样使用返回/继续一个好主意?是否有任何可能的维护或可读性问题?
Meh*_*ari 31
我个人选择一种方法的方法是,如果if零件的主体非常短(最多3或4行),那么使用该return/continue变体是有意义的.如果身体很长,那么跟踪控制流程就更难了,所以我选择了else版本.
因此,通常,这种方法限制return/continue样式的使用以跳过一些数据并避免进一步处理,而不是使用以下方法之一(更适合if/else)来处理它.
MSa*_*ers 13
编译器几乎肯定会生成相同的代码.即使它没有,差异可能是无关紧要的.因此,相关论点肯定是人们如何阅读它.
因此,问题是"//做一些东西"和"做其他东西"是多么相似.如果它们在概念上相似,请使用if/else.如果它们在概念上不同,请使用continue/return.
Joh*_*ski 12
这取决于分支的长度.如果初始if检查很短,并且正文很长,那么使用你描述的return/continue是好的.如果两者if和else部分都很长,我会将它们提取为单独的函数.
我建议阅读Code Complete,它会讨论很多这样的事情.
Ras*_*dit 11
如果首先处理终止条件,则代码将更易读.我总是喜欢,检查需要中断或返回的条件而不是那些需要冗长代码执行的条件.我更喜欢:
if (termination condn)
return;
// code
// code
Run Code Online (Sandbox Code Playgroud)
至
if (success condn)
{
// code
// code
}
else
return;
Run Code Online (Sandbox Code Playgroud)
这使得阅读和理解代码更容易.
巧妙的回答是,这一切都取决于.
我的一般感觉是,如果condition是一个罕见的,保护(例如检查为空)或错误条件,那么我倾向于使用return或continue
如果这是一个预期的案例,那么我倾向于使用你的第一种方法.
但请注意,我说"倾向".这些条件之间的界限是模糊的,可能会根据项目和我正在与谁合作而变化.
我通常更喜欢
while( loopCondition ) {
if( innerCondition ) {
DoStuff();
} else {
DoOtherStuff();
}
}
Run Code Online (Sandbox Code Playgroud)
如果 DoStuff 的长度超过 1-2 行阈值,则 continue 可能很难理解(并且很容易错过意图)。这似乎是将逻辑重构为一些较小方法的好机会。
不要为了过早的优化而牺牲可读性。
例如:
void function() {
if( condition ) {
//do some stuff
} else {
//do other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下二进制相当于
void function() {
if( condition ) {
//do some stuff
return;
}
//do other stuff
}
Run Code Online (Sandbox Code Playgroud)
(即生成的代码可能是相同的)。但前者的可读性要好得多,因为你可以清楚地看到代码要么是X,要么是Y。