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代码>
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行长。。。这让我的头很痛,而且完全摧毁了我的灵魂。压倒性的共识似乎是情况更糟。