协慌网

登录 贡献 社区

一个函数应该只有一个 return 语句吗?

是否有充分的理由说明为什么在函数中只有一个 return 语句是更好的做法?

或者,一旦逻辑正确就可以从函数返回,这意味着函数中可能有很多返回语句?

答案

我经常在一个方法的开头有几个语句来返回 “简单” 的情况。例如,这个:

public void DoStuff(Foo foo)
{
    if (foo != null)
    {
        ...
    }
}

...... 可以像这样更具可读性(恕我直言):

public void DoStuff(Foo foo)
{
    if (foo == null) return;

    ...
}

所以,是的,我认为从函数 / 方法中获得多个 “退出点” 是很好的。

没有人提到或引用Code Complete,所以我会这样做。

17.1 回归

最小化每个例程中的返回数 。如果从底部读取它,你就不会意识到它返回到某个地方的可能性。

在增强可读性时使用返回 。在某些例程中,一旦知道答案,就要立即将其返回到调用例程。如果以不需要任何清理的方式定义例程,则不立即返回意味着您必须编写更多代码。

我会说任意对多个退出点进行任意决定是非常不明智的,因为我发现这种技术在实践中反复使用 ,实际上为了清楚起见,我经常将现有代码重构为多个退出点。我们可以比较这两种方法: -

string fooBar(string s, int? i) {
  string ret = "";
  if(!string.IsNullOrEmpty(s) && i != null) {
    var res = someFunction(s, i);

    bool passed = true;
    foreach(var r in res) {
      if(!r.Passed) {
        passed = false;
        break;
      }
    }

    if(passed) {
      // Rest of code...
    }
  }

  return ret;
}

与此相比,在那里允许多个出口点的代码: -

string fooBar(string s, int? i) {
  var ret = "";
  if(string.IsNullOrEmpty(s) || i == null) return null;

  var res = someFunction(s, i);

  foreach(var r in res) {
      if(!r.Passed) return null;
  }

  // Rest of code...

  return ret;
}

我认为后者相当清楚。据我所知,多个退出点的批评现在是一个相当古老的观点。