Why do C/C++ -Coding standard says that we should not have multiple return in function?
在我的组织,我们的后续Misra编码指南。这是我们所说的编码指引,不在有多回报的功能。你有任何的主意吧?为什么是这样的吗?
- 我和许多其他人都认为这是一种100%编写代码的糟糕方法。我认为它的推理在引进时更有说服力,但后来有所减弱。
- 具有多个返回路径的长函数很难读取。保持函数尽可能短也有助于提高可读性。
- 我个人不喜欢这个规则。防止出现保护条款之类的情况。
- 你是在问我们对这条规则的看法,还是在问我们要了解制定标准的人的想法?我认为这是一个糟糕的规则,但是那些发誓要遵守它的人坚持认为它使代码更容易推理。我可以为他们提供的每一个例子提供一个反例。
- @克里斯,它已经减少了RAII。在这个习语之前,多个返回路径是危险的。
- 那么最常见的成语if (trivial_case) return trivial_answer;后面跟着函数的其余部分呢?我建议将函数的其余部分放在else子句中,这对可读性没有帮助。
- @Matthewlundberg,是的,这就是goto cleanup;的用武之地。
- @乔兹,我反对它的一个主要原因是压痕。尝试编写代码来处理使用这个的HRESULT返回值,不使用goto,也不像一个巨大的箭头。
- @克里斯:米斯拉对埃多克斯1〔4〕说了些什么?在过去,那些曾经试图把"单一出口"推到我身上的人,也曾说过"没有goto","最大圈复杂度为10"等疯狂的话。
- 《米斯拉法》并非普遍适用的指导方针。
- @乔兹,在我看来像是在说"去…你自己。雷伊打败了埃多克斯1〔4〕和埃多克斯1〔4〕在两个都在那里之后打败了剩下的一切。
- 无论如何,我们最终可能会重复这里所说的一切:stackoverflow.com/questions/36707/…
- @克丽丝:我很高兴我不用自己去对付米斯拉。我只是查了一下,它还禁止以东克星。我很难相信像这样涂上这种语言的书呆子是可以接受的能力替代品。嘿,至少他们允许break(但他们不允许continue)。
- @乔兹,我有时用continue和return的方法一样:if (!trivial condition) {continue;}。当然,这种情况很少发生。
- 把这样一个问题C和C++同时标记是一个很坏的想法。C++有析构函数,C没有,所以在函数出口上清理的需求和方法根本没有可比性。
- 所以您的组织也不允许递归函数?
我不同意函数不能有多个返回。有时,提前返回可以使代码更容易阅读和维护。
1 2 3 4 5 6 7
| function DoStuff
{
if ( simpleCondition ) return result;
DoComplcicatedProcess
return complicatedOperatotionResult;
} |
是的,可以将其包装为一个条件,但在这种情况下,它很容易阅读,而且可能更高效。
首先,单一的回报有点容易维护和理解。第二,多次返回很可能意味着我们直接返回的是一个值,而不是数量。它使函数更容易理解。我给你举个简单的例子。
多次返回示例
1 2 3 4 5 6 7
| CalculateInterest(int cost)
{
if (cost < 100)
return cost * .2;
else
return cost * .3;
} |
单回路同一功能
1 2 3 4 5 6 7 8 9 10 11
| CalculateInterest(int cost)
{
float interest;
if (cost < 100)
interest = cost * .2;
else
interest = cost * .3;
return interest;
} |
- 我忍不住说了一句话。
- @克里斯,我的例子当然是为了说明这一点,而不是关于如何计算利息。
带有多个返回语句的函数比较混乱,如果方法太大,就不容易理解。您可能会不小心跳过一些应该执行的行。
如果您正在编写一个不需要以后维护的小程序,可以忽略这个规则。但是,对于将来可能维护的较长程序,当人们在一段时间后修复错误时,很可能忽略一些返回到调用函数的代码块,并将一些代码放在该代码块下面,假定它将运行。一个这样的例子可能是清理代码。
可以很容易地说,程序员应该更加小心,但遵循一个返回策略将使避免此类错误变得更容易。
- 那些应该执行的行的性质是什么?如果它是毁灭者,那么它对RAII就不那么重要了。
- "多个返回语句"是问题还是"长的、混淆的函数"是问题?你是在治疗症状还是疾病?
- 具有多个返回的函数的固有混淆至少是有很大争议的。保护条款是使用它们使事情更清楚的一个例子。
- 哦,哈哈。好评论。然而,事实上,两者都会使另一个恶化。有时,当人们在一段时间后修复bug时,很可能会忽略一些返回的代码块,并将一些代码放在该块下面。但是正如您所说,如果有多个语句是一个好主意,那么很容易举出一些例子。任何方法都不能证明是愚蠢的。
- 如果在每种情况下都需要做一些事情,那么情况就稍有不同——如果您是添加了这些事情的人,那么您应该考虑重构以避免重复。但是,如果你认真遵循一个返回规则,你最终不可避免地会添加嵌套、额外的标志和移动部件,这些都必须被考虑在内。你基本上是在为读者制造更多的认知负荷。我认为所有的额外性都不应该存在,直到它必须存在。