Coding style 对于返回值,哪种语法更好?

Coding style 对于返回值,哪种语法更好?,coding-style,return-value,Coding Style,Return Value,我一直在做大量的代码审查,我注意到的一种模式是: public bool MethodName() { bool returnValue = false; if (expression) { // do something returnValue = MethodCall(); } else { // do something else returnValue = Expression

我一直在做大量的代码审查,我注意到的一种模式是:

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

    return returnValue;
}
这不是我应该怎么做的我应该在知道它是什么的时候返回值。这两种模式中哪一种更正确


我强调,逻辑的结构似乎总是这样的,即返回值只分配在一个格子中,分配后不会执行任何代码。

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


return expression ? MethodCall() : Expression;

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

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


是否更好是主观的。

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

我想我是少数,但我喜欢示例中提供的样式。IMO,添加日志语句和设置断点很容易。另外,当以一致的方式使用时,“模式匹配”似乎比多次返回更容易


但是,我不确定是否有一个“正确”的答案。

我猜编码人员采用了这样一种设计:在方法的顶部定义一个对象来返回(例如,List-toReturn=new-ArrayList();),然后在方法调用期间填充它,并以某种方式决定将其应用于布尔返回类型,这很奇怪


也可以是一个编码标准的副作用,它表示在方法主体的中间不能返回,只有在结束时。

即使在返回赋值之后没有执行代码,也不意味着以后不必添加某些代码。
这不是可以使用的最小的代码块,但它对重构非常友好。

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

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


当然,如果您的方法有几行长,或者不需要任何清理,则可能会有多个返回。

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

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

return expression ? MethodCall() : Expression;

它更短,可读性更强。

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;

所使用的模式非常详细-但是如果您想知道返回值,而不需要打开Registers窗口并检查EAX,那么调试也更容易。

在以下任何情况下,都可以立即从方法返回:

  • 您已经找到一个边界条件,需要返回一个唯一的或前哨值:
    if(node.next=null)return NO_value_found
  • 所需的值/状态为false,因此该方法的其余部分不适用(也称为保护子句)。例如:
    if(监听器==null)返回null
  • 该方法的目的是查找并返回特定的值,例如:
    if(nodes[i].value==searchValue)返回i
  • 在一个子句中,该子句从方法的其他地方未使用的方法返回唯一值:
    if(userNameFromDb.equals(SUPER_USER))return getSuperUserAccount()

  • 否则,只有一个return语句是很有用的,这样可以更容易地添加调试日志记录、资源清理和遵循逻辑。我尝试先处理上述4种情况,如果它们适用,然后尽可能晚地声明名为
    result(s)
    的变量,并根据需要为其赋值。

    在返回语句之前,您正在做不同的事情,因此//do something和//do something。是的,在我正在审阅的代码中,它通常是字符串或布尔值,但它可以是任何对象类型。我之所以使用bool,是因为我遇到的最后一个例子(5分钟前)是bool。没有返回其他对象的原因是因为设计是垃圾,里面几乎没有对象。如果你必须看一下我正在审阅的代码,你会认为这是糟糕的OOP设计中最不重要的一个实例。。。大部分代码都在一个名为Form1.cs的文件中,该文件大约有4k行长。。。这让我的头很痛,而且完全摧毁了我的灵魂。压倒性的共识似乎是情况更糟。