C / C ++(其他语言太?)有条件的早期返回良好的代码实践

时间:2013-06-15 01:43:01

标签: c++ c if-statement conditional

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

以下是一些例子:

版本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!
  }
}

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

1 个答案:

答案 0 :(得分:0)

如果else子句很短,那么else只会增加清晰度,最多只需几行代码。如果您想要检查几个初始条件,则源会很快混乱。

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

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

do {
 ...
 } while (0);

我不愿意使用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!
}

函数体中返回的唯一问题是有时扫描函数的人没有意识到返回。在小型功能中,在一个屏幕上几乎可以看到所有内容,错过返回的可能性非常小。然而,对于大型功能,中间的返回可能会被遗漏,尤其是大型复杂功能,这些功能经历了几个维护周期,并且需要进行大量的工作和处理。