Java - return or if-else
Possible Duplicate:
Should a function have only one return statement?
这就是我要说的。
1 2 3 4 5 6 7 8 9 10 11
| if (condition) {
aVariable = 1;
return;
}
doSomething();
if (condition) {
aVariable = 1;
} else {
doSomething();
} |
其中一个优先于另一个(惯例等)?
- 问题似乎很模糊。你想知道哪条路更好?
- 重复:stackoverflow.com/questions/137115/…stackoverflow.com/questions/36707/…
提前返回可以通过减少代码中的嵌套来提高可读性。
在某些语言中,最好有一个返回语句,例如在C++中,您应该在顶部分配并在方法的底部进行分配,但是Java不是这样的语言,因此比起单个返回语句更喜欢可读性。
许多人使用单一返回规则是因为他们不理解它的存在原因,或者因为他们有管理语言的背景。
请注意
在您对编写代码的"一种真正的方式"发表评论之前,请暂停片刻并考虑以下内容。
为什么必须只有一个返回语句?
如果你想不出一个好的理由,那就不要再争论应该是这样的了。
- 我认为开发Java的人不知道这个:P.因为在"大多数"中,Java中的代码在末尾有返回语句。*我在JDK中看到的代码
- @ NIDHIN——创建Java的人使得有可能返回任何地方,他们不强制执行这种"单返回"规则。试着想想"为什么应该有一个单一的回报",看看你能想到什么原因。开发人员需要根据具体情况决定是使用嵌套还是尽早返回,可读性是最好的度量方法。
- 基本上,您不需要通过使用早期返回来提高代码的可读性。如果你这样做的话-你的代码已经是一团糟了,提前返回并不能帮助你…很多。
- 通过减少if/else的嵌套,您已经提高了可读性。
- @Sohnee我们讨论的是最佳实践,而不是如何将Vales从功能中返回。顺便说一句,我不是投你反对票的人。)
- @你还没有解释支持你最佳实践的理由。作为开发人员,我们应该利用我们的经验,根据具体情况来决定我们认为该方法应该尽早返回还是只返回一次。对于这样的细节,不应该有一个"最佳实践"——最佳实践是保持代码的可读性,并且根据您正在编写的特定方法,您将得到一个不同的答案。最佳实践并不存在于如此低的水平。
- 你们所有人说的一次返回是什么意思?单个返回将放在函数中的什么位置?
- @用户1075261通过"单一返回",我们的意思是该方法只存在于单一的地方,不一定使用返回语句,因为在这个问题中,当它到达末尾时返回(或者如果您在该方法中放置一个额外的返回语句)。
- 建议将讨论转移到一个现有问题上,这个问题重复:stackoverflow.com/questions/36707/…
- @索尼,单一退货规则是从哪里来的?
- @用户1075261-它在托管语言中很有用,因为您关心内存的分配和取消分配。出于这个原因,通常需要仔细地对方法进行排序,最后是返回语句。
可读性是最重要的。所以函数开头的早期返回是可以的,但一旦方法开始执行比检查其对象的输入/状态更复杂的操作,它应该只有一个返回。
如果它太复杂,就应该重构为多个函数。
- 使用-1,因为我通常更喜欢返回语句而不是执行if/switch语句以到达方法的末尾的代码。当然,一旦事情变得复杂,我完全赞成重构。此外,错误的输入应该导致异常,而不是早期返回。这在答案中还不够清楚。
- 错误的输入->异常,但有时会有琐碎的输入->琐碎的返回(例如1!=1)。
一旦您点击返回,该方法结束并返回到堆栈中的调用方法。
1 2 3 4 5 6 7
| public void myMethod(){
if (condition) {
aVariable = 1;
return;
}
doSomething();
} |
和
1 2 3 4 5 6 7
| public void myMethod(){
if (condition) {
aVariable = 1;
} else {
doSomething();
}
} |
也会这样做,但是对于任何一种方法来说,Afaik最好只有一个出口点(至少Edsger Dijkstra是这么说的)
第二个是首选的,因为方法应该只有一个返回语句,并且必须在方法本身的末尾。如果您想更深入地讨论这个主题,有许多程序可以对您的代码进行验证。其中之一就是PMD。还有一个有用的Eclipse插件,可以根据您正在寻找的约定来验证您的代码。
- 话虽如此,我有时不同意并使用第一个,当我认为更清楚地理解时;)
对于最佳实践,返回语句应该是最后一行函数的
使用else块是很好的方法,因为如果您想在将来添加一些其他代码,第一个代码块可能需要编辑
注:所有方法都有优缺点。他们不是银弹解决方案。
- 这是一个非常绝对的说法。很多时候,早期返回会阻止复杂的嵌套控制流,因此比单个返回更可取。
- @马克罗特韦尔:不是真的。如果在使用"最后一行返回"样式时发现代码结构过于复杂和嵌套,则意味着您需要重构代码。通常这意味着将验证从业务逻辑或类似的东西中移出。
- Eclipse实际上会在您有"无意义"的else(if-where is返回子句,而没有其他内容)时发出呜咽声。
- 我同意马克的观点。严格遵守诸如"结尾只返回一次"或"循环不跳"之类的规则可能会导致复杂的代码。然而,"破坏"这些规则的原因必须是可读性和可理解性,而不是程序员的懒惰。
- @如果您使用在大多数情况下不复杂的标准编写方法,则为max,因为方法中的行数应该是最小的。例如JDK源代码
任何一个代码段都可以工作。它将取决于使用代码的上下文。
不,你可以用两种方式。当您有许多其他条件时,也使用第一种方法,返回将使您离开方法。这样就没有嵌套条件。