c++ - C/C++(还有其他语言吗?)有条件提前返回良好代码实践

标签 c++ c if-statement conditional-statements

最近,我正在审查我维护的一些代码,我注意到一种与我习惯的做法不同的做法。因此,我想知道在函数中执行提前返回时应使用哪种方法。

这是一些示例:

版本 1:

int MyFunction(int* ptr)
{
  if(!ptr) {  // oh no, NULL pointer!
    return -1;  // what was the caller doing? :(
  }
  // other code goes here to do work on the pointer
  // ...
  return 0;  // we did it!
}

版本 2:

int MyFunction(int* ptr)
{
  if(!ptr) {  // oh no, NULL pointer!
    return -1;  // what was the caller doing? :(
  } else {  // explicitly show that this only gets call when if statement fails
    // other code goes here to do work on the pointer
    // ...
    return 0;  // hooray!
  }
}

因此,我想知道对于那些经历过(并幸存下来)多次代码审查的人来说,哪一种被认为是“最佳实践”。我知道每个人实际上都做了同样的事情,但是“其他”在可读性和清晰度方面是否增加了很多?感谢您的帮助。

最佳答案

如果 else 子句很短,最多只有几行代码,那么 else 只会增加清晰度。如果您想要检查多个初始条件,源很快就会变得困惑。

唯一一次我会使用 else,如果它是一个带有小 else 的小函数,这意味着少于大约 10 行源代码,并且没有其他初始检查需要进行。

在某些情况下,我使用了单个循环,以便一系列初始检查可以使用中断来离开。

do {
 ...
 } while (0);

我讨厌使用 goto,它实际上可以保证至少有一个真正的 goto 信徒接受更少的编程。

很大程度上取决于您组织的任何代码标准。我倾向于喜欢极简主义,所以我使用您提供的第一个版本,而不使用其他版本。

我也可能在一个较小的函数中执行如下操作,例如少于 20 或 30 行:

int MyFunction(int* ptr)
{
  int iRetStatus = -1;  // we have an error condition
  if (ptr) {  // good pointer
      // stuff to do in this function
      iRetStatus = 0;
  }

  return iRetStatus;  // we did it!
}

函数体中返回的唯一问题是有时人们扫描函数时没有意识到有返回。在小型函数中,几乎所有内容都可以在一个屏幕上看到,因此错过返回的可能性非常小。然而,对于大型函数,中间的返回可能会被错过,特别是大型复杂函数,这些函数已经经历了多个维护周期,并且有很多繁琐的工作和解决方法。

关于c++ - C/C++(还有其他语言吗?)有条件提前返回良好代码实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17119451/

相关文章:

c++ - 如何读取 PCIe 总线上使用的带宽?

C++ 继承

c++ - 关闭一个对话框并打开另一个对话框

c++ - Rcpp 数值 vector 输出只返回一个值

javascript - 检查变量是否为 false,而不是 true 或 undefined

mysql - rails if 语句,如果没有找到记录

在 OpenCV 中创建 XML 文件

c - Select() 使用相同的套接字描述符发送和接收

c - 插入函数哈希表C

javascript - 检查数组中的项目