是编码风格的原则-例如单出口原则
1960年代后期,仍然对是否要退出单一出口或多次出口的人们仍然束手无策。那时,这样的讨论很重要,因为我们还处于结构化程序员的初期,并且有很多阵营宣称Bohm-Jacopini结构化程序定理的发现并不普遍适用于所有编程结构。
这应该早就解决。嗯,它已经解决了(确切地说,在学术界和整个行业都是近四个世纪),但是人们(绝对赞成或反对的人)却没有引起注意。
至于我的其余答案,都是相对的(软件中没有什么?):
是。一般情况下,大部分时间都是针对极端情况的警告和针对特定语言的编程结构。
总是还是只是有时候?
大多数时候。
到底有什么不同?
要看。
可读代码与不可读代码。复杂度的增加(我们现在应该知道,这增加了引入错误的可能性)与更简单的复杂度(因此,错误的可能性更小)。编译器未添加隐式返回的语言(例如Pascal,Java或C#)以及默认为int(C和C ++)。
最后,这是一项需要在键盘后面进行人工/小时训练的技能。有时,可以有多个return语句,例如此处(在某些Pascal'esque伪代码中):
function foo() : someType
begin
if( test1 == true )
then
return x;
end
doSomethignElseThatShouldnHappenIfTest1IsTrue();
return somethingElse();
end;
目的很明确,该算法足够小且不够复杂,因此不能保证创建一个“标志”变量,该变量保留单个返回点中使用的最终返回值。该算法可能有错误,但其结构非常简单,以至于检测错误的工作(很可能)可以忽略不计。
有时不是(这里使用类似C的伪代码):
switch(someVal)
{
case v1 : return x1;
case v2 : return x2:
case v3 : doSomething(); // fall-through
case v4: // fall-through
case v5: // fall-through
case v6: return someXthingie;
...
...
default:
doSomething(); // no return statement yet
}
在此,该算法不具有简单的结构,并且switch语句(一种C风格的语句)允许使用掉落步骤,这些掉落步骤可能会或可能不会有意作为算法的一部分进行。
也许算法是正确的,但是写得不好。
或者,也许是由于程序员无法承受的外力,这是合法需要的算法的实际(正确)表示。
也许是错的。
揭露任何事实的真相需要付出更多的努力比上一个示例。这里是我坚信的东西(请注意,我没有正规的研究来证明这一点):
假设假定代码片段正确:
如果代码段代表具有固有简单流结构的简单算法,则多个return语句可提高此类代码段的可读性和简便性。简而言之,我并不是小意思,而是天生的可理解或自证,即不需要过多的阅读努力(也不会诱使人们呕吐,咒骂某人的母亲或在他们必须阅读时吞下子弹。 )
如果返回值是在整个算法执行期间计算的,或者算法中负责计算返回值的步骤可以在算法结构内的一个位置组合在一起,则单个返回语句可提高该代码段的可读性和简洁性。
如果单个返回语句需要对一个或多个标志变量进行赋值,则会降低该代码段的可读性和简单性,并且这种赋值的位置在整个算法中并不统一。
如果返回语句在整个算法中分布不均匀,并且如果它们在大小或结构上不统一的相互排斥的代码块之间有界线,则多个返回语句会降低此类代码的可读性和简洁性。
这与所讨论的代码片段的复杂性密切相关。而这又与圈数和霍尔斯特德复杂度度量有关。由此,可以观察到以下情况:
子例程或函数的大小越大,其内部控制流结构就越大,越复杂,并且您面临的问题是使用多个还是单个返回语句的可能性就越大。
得出的结论是:保持函数的小型化,一件事情只能做一件事情(并且要做好)。如果它们名义上具有较小的圈数和半数复杂度指标,那么它们不仅必定是最有可能正确的,而且是可理解的任务的执行,它们的内部结构也将相对不言而喻。
然后,只有这样,您才可以很容易地在不损失大量睡眠的情况下,决定是否使用一次收益和多次收益,而不会冒着任何选择引入错误的巨大风险。
人们还可以仔细研究所有这一切,并提出建议,当人们在面对单一收益或多重收益的问题时感到挣扎时,这是因为-由于缺乏经验,愚蠢或缺乏职业道德,他们没有编写干净的代码并且倾向于编写可怕的功能,完全不考虑环行和霍尔斯特措施。