`
找不着北
  • 浏览: 310593 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

只要一个返回语句

阅读更多

别再这样写了:

public boolean foo() {
 if (true) {
   return true;  
 }  else {  
 return false;  
 }
}

每次当我深入某个开源项目,看到大概是某个专家写的、并被有经验的专业人士审查过的这样的代码,我都会惊讶不已,竟然没有人去阻止这个开发者在这个方法里胡乱的放置返回语句。

请告诉我,把代码写成下面的样子很难吗?

public boolean foo() {  
 boolean flag = true;  
 if (true) { 
   flag=true;
 }  
 else {
   flag=false;
 }
 return flag;
}

这是Java基本常识。实际上,这不仅是Java基本常识,这是小学水平的Java知识。如果你的方法返回一个值,你应该在方法的开始处把它声明做 一个变量。然后再去做一些赋予这个变量正确意义的操作。然后,在你的最后一行,把这个变量返回给调用程序。这样做不仅仅是为写出好的代码,这是一种有教养 的表现。

你是否曾试图修改过一些在方法里到处都是返回语句的程序代码?无从下手。事实上,去维护这样的代码,你第一要做的是重新组织它的结构,让它里面不再有一大 堆的返回语句。这样才能把事情做好。没有任何一个方法是不可以写成只在末尾处有一个的、单一的、易于找到的返回语句的形式的。

的确,烂程序员总有一万个理由来说明他们为什么编写出这样糟糕的程序代码。“我只是为了避免在返回时一堆的多余的条件判断语句。”那好,首先,我告诉你, 计算机中执行一些条件判断语句时是该死的快,你用短路一个方法来节省CPU的一两个指令操作不是显的太荒诞了吗。此外,如果这些所谓多余的条件判断语句最 终没有派上用场的话,这是否是一个有用的信号来说明你的“多余”的代码可能需要重写,也许可以把它们重构成另外一个方法,让它们显的不多余?

关键要说的是,没有任何理由可以为写糟糕的代码或当懒惰的程序员做托辞,特别是当写出好的代码并不是那么困难的情况下。不要在写出里面有成百上千个返回语句的方法了。Java里的方法只可以返回一个值,相应的,一个方法应该有且只有一个返回语句。


:)

43
32
分享到:
评论
32 楼 huqing2010 2011-05-23  
Java里的方法只可以返回一个值,相应的,一个方法应该有且只有一个返回语句。

这是什么逻辑???
那你这么说 java语法直接规定只能写一个return算了 就可以解决所有问题了
31 楼 cmland 2011-04-13  
当面临复杂的逻辑时,多个return是个比较好的选择。当判断过多,超过一定的限度,不觉得会让人很头大么?
30 楼 itl01 2011-04-11  

这两种代码性能上没有太大的差别,,多一个变量,一些赋值,,
第一种告诉你运行到这里return了 ,不用往下看了,后面一种就木有


另外,,转载请注明出处,,

29 楼 xyzxingyan 2011-04-11  
不知道是lz太聪明,还是我太傻,return和代码维护难没什么关系吧,java源码也是一个方法有很多return
28 楼 396858359 2011-04-10  
对于在这种情况,我好像没有固定的说用这种或者那种,我是两种都用的,即使在一个项目里面。只是根据不同的方法,具体的情况。使用适合的。
若是强制说这种不好,必须那样。认为不妥。
27 楼 kldwq2002 2011-04-09  
private boolean useCatchedActivity(Class<?> c) {
		boolean flag = false;
		View view = subViews.get(c.hashCode());
		if (view != null) {
			ViewParent parent = view.getParent();
			if (parent == null) {
				container.addView(view);
				flag = true;
			}
		} else {
			subViews.remove(c.hashCode());
			flag = false;
		}
		return flag;
	}

private boolean useCatchedActivity(Class<?> c) {
		View view = subViews.get(c.hashCode());
		if(view == null){
			return false;
		}
		ViewParent parent = view.getParent();
		if (parent == null) {
			container.addView(view);
			return true;
		}
		subViews.remove(c.hashCode());
		return false;
	}


这是刚刚写的两段代码,这是还是逻辑不算复杂的情况。
用第一种的是货真价实的SB。
26 楼 Nathanyu 2011-04-09  
  我觉得还是看情况来比较好,  并不一定强求。  但team就不同了
25 楼 jackra 2011-04-04  
很多编码习惯并不被team所重视.也是现在程序员质量下降的原因之一.
24 楼 xugang8289 2011-04-02  
楼主的博文极大误导了初学者, 对于一个函数来说, 建议采用一个return是函数式编程的风格.这样做的目的是确保一个函数尽可能的短小. java并不是一个函数式编程语言.所以对于java来说,这只是风格, 不是真理. 如果你了解"将if else嵌套重构为防卫语句"的重构手法, 相信你会发现多个return有时会更好.
23 楼 kldwq2002 2011-03-31  
唉,说什么好呢,楼主请不要误导新人。
1.代码是否清晰和有多少个return没有关系,代码不清晰的根本原因是把一堆原本可以抽象成其它方法的逻辑堆在一个方法里导致的,就算只有一个return,如果不解决这个根本问题,代码的清晰程度也不会高到哪里,这不是重构的关键。

2.方法里就算有很多return,只要逻辑上是正确和清楚的,我看不出为什么非得整成一个return。在放屁前脱一次裤子的意义是什么呢?

3.楼主的两个例子完全可以归为代码风格,在我看两个逻辑都很清楚。如果这也能上升到烂程序员程度,您可真要检查下自己的大脑了。
22 楼 Jclick 2011-03-31  
照你这样说。struts2里应该这样写。
String str = "";
if(...){
   str = INPUT;
}else{
   str = SUCCESS;
}
return str;


是吗?
21 楼 yuantong 2011-03-30  
好吧,我承认你的代码写的非常的优美,并且我认为你不是一个懒惰的程序员!
20 楼 cuityang 2011-03-30  
建议楼主 看看 重构 1~2次使用 可以不声明变量 因为声明变量会占内存
19 楼 nianien 2011-03-30  
LZ nc sb 2d
18 楼 isaac.198 2011-03-30  
不错,虽然大家分歧很在大,我还是学习了。
以前我就是楼主抨击的那种人。楼主说的对,有时这确实不好。
然后一看评论,也对,如果一个小分支(如参数错误、代码行数相对极短),能直接return,也没有必要搞那么多分支。

最后说下个人观点:
一个方法尽量不超过一个屏幕的长度,楼主说的代码难懂的可能性就比较小了。
17 楼 56553655 2011-03-29  
言词过于偏激,没有任何东西可以证明只有一个一个返回是最好的,举一个简单的示例:
public void doSomething(String param){
    if(param == null){
        return;
    }
    //假如下面有50条语句需要执行
}
你可以说写成这样:
public void doSomething(String param){
    if(param != null){
        //假如下面有50条语句需要执行
    }   
}
有什么的差别,从结果上看是没有,不过你不觉得代码多了一层缩进,看起来更费力不
16 楼 lizepeng201021 2011-03-29  
return false;  // 正常
fireaap 写道
public boolean foo() {
if (true) { // 特殊情况
   return true; 
}

……
return false;  // 正常情况

}

我更喜欢这样写,一个方法往往只有一条主线,其他的都是特殊情况。这就是是防御性编码。
这样写代码少,也很清晰。

赞成这种,这觉得楼主说的有些偏了。。
15 楼 jaykuen 2011-03-29  
不能刻意的去追求单一出口的编程模式,如果多个出口可以使程序更好理解,未尝不可。为了单一出口而定义一些没有什么含义的变量,我想也不是好的做法吧。因地制宜,还是比较好的选择。将单一出口改变成多出口也是一种重构方式,因为有的时候多出口比单出口更容易理解程序。
14 楼 xuyan2680 2011-03-29  
 if(true)

太强了
13 楼 nianien 2011-03-29  
LZ的理论真够狗血的
完成逻辑,返回结果,谁都指定的简单道理
却被你这种人误认子弟
按你的说法,都不用switch,break;
连变量都不用,连返回语句也不用
直接用成员变量,一律void方法不更好?

相关推荐

    MYSQL常用命令大全

    -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 A:常用source 命令 进入mysql数据库控制台, 如mysql -u root -p mysql&gt;use 数据库 然后使用source命令,后面参数为脚本文件(如...

    微软JavaScript手册

    break 语句 终止当前循环,或者如果与一个label 语句关联,则终止相关联的语句。 call 方法 应用对象的一个方法,用当前对象代替另一对象。 callee 属性 返回正执行的函数对象,它是指定的函数对象的文本正文。 ...

    javascript文档

    break 语句 终止当前循环,或者如果与一个label 语句关联,则终止相关联的语句。 call 方法 应用对象的一个方法,用当前对象代替另一对象。 callee 属性 返回正执行的函数对象,它是指定的函数对象的文本正文。 ...

    JScript 语言参考

    break 语句 终止当前循环,或者如果与一个label 语句关联,则终止相关联的语句。 call 方法 应用对象的一个方法,用当前对象代替另一对象。 callee 属性 返回正执行的函数对象,它是指定的函数对象的文本正文。 ...

    经典全面的SQL语句大全

     UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自 TABLE1...

    VBSCRIPT中文手册

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    vb Script参考文档

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    VBScript 语言参考

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    VBScript 语言参考中文手册CHM

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    C语言程序设计标准教程

    把多个语句用括号{}括起来组成的一个语句称复合语句。 在程序中应把复合语句看成是单条语句,而不是多条语句,例如 { x=y+z; a=b+c; printf(“%d%d”,x,a); } 是一条复合语句。复合语句内的各条语句都必须以分号...

    VBSCRIP5 -ASP用法详解

    InStrRev 函数 返回一个字符串在另一个字符串中出现的位置,是从字符串的末尾算起。 Int 函数 返回数的整数部分。 整数除法运算符(\) 两数相除,返回的商取其整数部分。 Is 运算符 比较两个对象引用变量。 ...

    一个程序员的自省 iBATIS In Action:什么是iBATIS(二)

    使用iBATIS只要五分钟我们就可以创建一个完整的应用程序了——当然这不是大型的ERP(Enterprise Resource Planning)解决方案,也不是大规模的电子商务网站,只是一个简单的命令行工具,它可以执行iBATIS SQL Map中...

    Excel函数应用大全.doc

    只要有一个参数的逻辑值为假,则返回FALSE(假)。  语法:AND(logical1,logical2,…)。  参数:Logical1,logical2,…为待检验的1~30个逻辑表达式,它们的结论或为TRUE(真)或为FALSE(假)。参数必须是逻辑值或者...

    C#基类库(苏飞版)

    取汉字拼音的首字母,只要你输入一个汉字,或者是多个汉字就会取出相应的道字母,主要是方便查询使用的 复制代码 16.配置文件操作类 ConfigHelper 1.根据Key取Value值 2.根据Key修改Value 3.添加新的Key ,Value...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    8.5.4 例2:从下一行中返回一个值 204 8.6 First_value和Last_value 205 8.6.1 例子:使用First_value来计算最大值 206 8.6.2 例子:使用Last_value来计算最小值 207 8.7 其他分析函数 207 8.7.1 Nth_value(11...

    自考04747《Java语言程序设计(一)》简答题全集.doc

    如果源文件中有多个类,那么只能有一个类是public类 〔1分〕 如果有一个类是public类,源文件的名字必须与这个类的名字完全相同,扩展名是java 〔2分〕 如果源文件没有public类,源文件的名字只要和某个类的名字...

    最新自考04747《Java语言程序设计(一)》简答题全集资料.doc

    如果源文件中有多个类,那么只能有一个类是public类 (1分) 如果有一个类是public类,源文件的名字必须与这个类的名字完全相同,扩展名是java (2分) 如果源文件没有public类,源文件的名字只要和某个类的名字...

    MySQL命令大全

    -d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table 4.导入数据库 A:常用source 命令 进入mysql数据库控制台, 如mysql -u root -p mysql&gt;use 数据库 然后使用source命令,后面参数为脚本...

    《ASP网络程序设计》实验指导书(网站建设与维护&网络程序设计)

    函数是一种特定的运算,在程序中要使用一个函数时,只要给出函数名并给出一个或多个参数,就能得到它的函数值。 VBScript内部函数可分为:转换函数、字符串函数、日期和时间函数、数学函数和检验函数。 1.转换函数 ...

Global site tag (gtag.js) - Google Analytics