这段代码:
if( someCondition )
return doSomething();
return doSomethingElse();
与此代码相比:
if( someCondition )
return doSomething();
else
return doSomethingElse();
本质上,它们是相同的,但是什么是最好的风格/性能/…(当然,如果答案中有任何非自以为是的部分)?还要考虑多个“if else”的情况:
if( someCondition )
return doSomething();
else if( someOtherCondition )
return doSomethingDifferently();
//...
else
return doSomethingElse();
谢谢!
原文由 rubenvb 发布,翻译遵循 CC BY-SA 4.0 许可协议
当一个函数中有多个 return 语句时,这称为“提前返回”。如果您在 Google 上搜索“提前退货”,您会发现一个接一个的链接表明它很糟糕。
我说废话。
人们声称早退是不好的,有两个主要原因和一个次要原因。我将通过它们并按顺序给出我的反驳。请记住,这是我的全部意见,最终您必须自己决定。
反驳:这就是 RAII 的用途。一个设计良好的程序不会以这样一种方式分配资源,即如果执行提前离开范围,这些资源就会泄漏。而不是这样做:
…
你来做这件事:
并且提前返回不会导致资源泄漏。在大多数情况下,您甚至不需要使用
auto_ptr
因为您将创建数组或字符串,在这种情况下,您将使用vector
,string
或类似的东西。由于可能出现异常,您应该像这样设计您的代码以获得稳健性。异常是一种提前返回的形式,例如显式
return
语句,您需要准备好处理它们。您可能无法处理foo()
中的异常,但foo()
应泄漏。职能应该有一个责任是一种普遍的理念。我同意这一点。但是人们对此太过分了,并得出结论,如果一个函数有多个返回,它必须有多个责任。 (他们通过说函数的长度不应超过 50 行或其他任意数字来扩展这一点。)我说不。仅仅因为一个函数只有一个职责,并不意味着它不需要做很多事情来履行这个职责。
以打开数据库为例。这是一项责任,但它由许多步骤组成,每个步骤都可能出错。打开连接。登录。获取一个连接对象并返回它。 3 个步骤,每个步骤都可能失败。您可以将其分解为 3 个子步骤,但不要使用这样的代码:
你最终会拥有:
因此,您实际上只是将假定的多个职责移至调用堆栈中的更高点。
换一种说法,这实际上只是试图将所有东西塞进一个物体形状的盒子里,即使它不属于那里。当然,也许连接是一个对象。但是是登录吗?登录尝试不是(IMO)对象。这是一个手术。或者算法。试图采用这种算法并将其塞进一个对象形状的盒子中是对 OOP 的无端尝试,只会导致代码更复杂、更难维护,甚至可能效率更低。