哪种语法更适合返回值?

时间:2008-09-26 14:09:28

标签: coding-style return-value

我一直在进行大规模的代码审查,我注意到的一个模式是:

public bool MethodName()
{
    bool returnValue = false;
    if (expression)
    {
        // do something
        returnValue = MethodCall();
    }
    else
    {
        // do something else
        returnValue = Expression;
    }

    return returnValue;
}

这不是我将如何做到这一点当我知道它是什么时,我会回复该值。这两种模式中的哪一种更正确?

我强调逻辑似乎总是这样构造,使得返回值仅在一个plave中分配,并且在分配后不执行任何代码。

13 个答案:

答案 0 :(得分:4)

关于这个主题here进行了长时间的讨论。

答案 1 :(得分:3)

很多人建议你的方法只有一个退出点。您在上面描述的模式遵循该建议。

该建议的主要要点是,如果在从方法返回之前必须清理一些内存或状态,最好只将代码放在一个地方。有多个退出点会导致清理代码重复或由于在一个或多个退出点丢失清理代码而导致的潜在问题。

当然,如果你的方法长了几行,或者不需要任何清理,你可以有多次返回。

答案 2 :(得分:2)

我会使用三元,以减少控制结构...


return expression ? MethodCall() : Expression;

答案 3 :(得分:2)

我怀疑我会成为少数,但我喜欢这个例子中的风格。可以轻松添加日志语句并设置断点IMO。另外,当以一致的方式使用时,“模式匹配”似乎比具有多个返回更容易。

然而,我不确定是否有“正确”的答案。

答案 4 :(得分:1)

一些学习机构和书籍提倡单一回归实践。

是否更好是主观的。

答案 5 :(得分:1)

这看起来像是糟糕的OOP设计的一部分。也许它应该在更高层次上重构,而不是在单个方法内部重构。

否则,我更喜欢使用三元运算符,如下所示:

return expression ? MethodCall() : Expression;

它更短,更易读。

答案 6 :(得分:1)

在任何这些情况下立即从方法返回:

  1. 您已找到边界条件,需要返回唯一或哨兵值:if (node.next = null) return NO_VALUE_FOUND;
  2. 所需的值/状态为false,因此该方法的其余部分不适用(也称为保护子句)。例如:if (listeners == null) return null;
  3. 该方法的目的是查找并返回特定值,例如:if (nodes[i].value == searchValue) return i;
  4. 您在一个子句中,该方法从方法中未使用的方法返回唯一值:if (userNameFromDb.equals(SUPER_USER)) return getSuperUserAccount();
  5. 否则,只有一个return语句很有用,这样可以更容易地添加调试日志记录,资源清理并遵循逻辑。我首先尝试处理上述所有4个案例,如果它们适用,则尽可能晚地声明一个名为result(s)的变量,并根据需要为其分配值。

答案 7 :(得分:0)

他们都完成了同样的任务。有人说方法应该只有一个入口和一个出口点。

答案 8 :(得分:0)

我也用它。这个想法是可以在程序的正常流程中释放资源。如果你在20个不同的地方跳出一个方法,并且之前需要调用cleanUp(),你将需要添加另一个清理方法20次(或重构所有内容)

答案 9 :(得分:0)

我猜编码器已经采用了在方法顶部定义一个对象返回的设计(例如,List< Foo> toReturn = new ArrayList< Foo>();)然后在方法调用期间填充它,并以某种方式决定将它应用于布尔返回类型,这是奇怪的。

也可能是编码标准的副作用,表明你不能在方法体的中间返回,只是在最后。

答案 10 :(得分:0)

即使现在分配了返回值后没有执行代码,也不意味着以后不必添加某些代码。

这不是可以使用的最小代码段,但它非常重构。

答案 11 :(得分:0)

Delphi通过自动创建一个名为“Result”的变量强制此模式,该变量将是函数的返回类型。无论函数退出时“结果”是什么,都是您的返回值。所以根本就没有“return”关键字。

function MethodName : boolean;
begin
  Result := False;
  if Expression then begin
    //do something
    Result := MethodCall;
  end
  else begin
    //do something else
    Result := Expression;
  end;

  //possibly more code
end;

答案 12 :(得分:0)

使用的模式是冗长的 - 但是如果你想知道返回值而不打开Registers窗口并检查EAX,它也更容易调试。