我应该使用return/continue语句而不是if-else吗?

sha*_*oth 28 c c# c++

在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是好的.如果两者ifelse部分都很长,我会将它们提取为单独的函数.

我建议阅读Code Complete,它会讨论很多这样的事情.

  • "必须编写程序供人们阅读,并且只有偶然的机器才能执行." - Sussman/Abelson,计算机程序的结构和解释 (5认同)

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)

这使得阅读和理解代码更容易.

  • 我同意,你应该总是测试异常,而不是正常情况.请参见http://stackoverflow.com/questions/114342/what-are-code-smells-what-is-the-best-way-to-correct-them/223881#223881. (2认同)

Chr*_*isF 6

巧妙的回答是,这一切都取决于.

我的一般感觉是,如果condition是一个罕见的,保护(例如检查为空)或错误条件,那么我倾向于使用returncontinue

如果这是一个预期的案例,那么我倾向于使用你的第一种方法.

但请注意,我说"倾向".这些条件之间的界限是模糊的,可能会根据项目和我正在与谁合作而变化.


Sam*_*ron 5

我通常更喜欢

while( loopCondition ) {
    if( innerCondition ) {
        DoStuff();
    } else {
        DoOtherStuff(); 
    }
}
Run Code Online (Sandbox Code Playgroud)

如果 DoStuff 的长度超过 1-2 行阈值,则 continue 可能很难理解(并且很容易错过意图)。这似乎是将逻辑重构为一些较小方法的好机会。

  • @MartinK.,始终包含它们是一个很好的做法,这样您以后就不会添加第二个语句并意外地将其从条件中排除。 (2认同)

elm*_*rte 5

不要为了过早的优化而牺牲可读性。

例如:

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。

  • 不同意你的第一个的可读性,特别是如果 if 分支比 else 短得多(考虑参数验证)。 (3认同)