是否有充分的理由说明为什么在函数中只有一个 return 语句是更好的做法?
或者,一旦逻辑正确就可以从函数返回,这意味着函数中可能有很多返回语句?
我经常在一个方法的开头有几个语句来返回 “简单” 的情况。例如,这个:
public void DoStuff(Foo foo)
{
if (foo != null)
{
...
}
}
...... 可以像这样更具可读性(恕我直言):
public void DoStuff(Foo foo)
{
if (foo == null) return;
...
}
所以,是的,我认为从函数 / 方法中获得多个 “退出点” 是很好的。
没有人提到或引用Code Complete,所以我会这样做。
最小化每个例程中的返回数 。如果从底部读取它,你就不会意识到它返回到某个地方的可能性。
在增强可读性时使用返回 。在某些例程中,一旦知道答案,就要立即将其返回到调用例程。如果以不需要任何清理的方式定义例程,则不立即返回意味着您必须编写更多代码。
我会说任意对多个退出点进行任意决定是非常不明智的,因为我发现这种技术在实践中反复使用 ,实际上为了清楚起见,我经常将现有代码重构为多个退出点。我们可以比较这两种方法: -
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;
}
我认为后者相当清楚。据我所知,多个退出点的批评现在是一个相当古老的观点。