0

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

这里有一些例子:

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

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

4

1 回答 1

0

如果 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!
}

函数体中返回的唯一问题是有时扫描函数的人没有意识到有返回。在一个屏幕上几乎可以看到所有内容的小型功能中,错过返回的机会非常小。但是对于大型函数,可能会错过中间的返回,尤其是那些经历了几个维护周期并且有很多杂乱无章和变通方法的大型复杂函数。

于 2013-06-15T01:49:28.297 回答