`
找不着北
  • 浏览: 314792 次
  • 性别: 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方法不更好?

相关推荐

    Oracle左连接返回多条记录中一条记录的查询语句

    Oracle左连接返回多条记录中一条记录的查询语句,更具指定条件分组排序,返回各组中第一条记录

    流程控制语句

    - 流程控制语句可以相互嵌套,例如在循环内部使用if语句,或者在if语句中包含另一个循环。 5. **三元运算符**:`condition ? expression1 : expression2`,如果条件为真,返回expression1的值,否则返回expression...

    Oracle的sql语句练习题及参考答案

    5. **子查询**:在`SELECT`语句中嵌套另一个`SELECT`语句,称为子查询,它可以用于复杂的数据过滤和计算: ```sql SELECT * FROM Employees WHERE Salary &gt; (SELECT AVG(Salary) FROM Employees); ``` 这将...

    update语句

    举个例子,假设我们有一个名为`Employees`的表,包含`ID`, `Name`, 和`Salary`三列,我们想把所有工资低于5000的员工的工资提升到6000,可以这样写: ```sql UPDATE Employees SET Salary = 6000 WHERE Salary ; ``...

    精品课件 Python从入门到精通 第4章 流程控制语句(共26页).ppt

    - `if` 语句的嵌套:可以在一个 `if` 语句的语句块内再嵌套其他 `if` 语句,形成多层条件判断。 2. 条件表达式:Python 提供了三元运算符,也称为条件表达式,形式为 `value_if_true if condition else value_if_...

    SQL语句执行顺序说明

    6. **整合简单、无关联的数据库访问**:如果有多个简单的数据库查询语句,可以尝试将其整合成一个复杂的查询,只要这些查询之间没有逻辑上的冲突或依赖关系。 7. **删除重复记录**:在某些情况下,可能需要删除表中...

    Arduino语言常用语句

    - **`loop()`**:这是一个无限循环函数,只要程序运行就会一直执行其中的代码。 #### 三、数字I/O 数字输入/输出(I/O)是Arduino中最基础也是最常用的特性之一。 - **`pinMode(pin, mode)`**:此函数用于设置指定...

    最易入门SQL语句教程.pdf

    2. **OR操作符**:只要任意一个条件为真,结果即被包含。 - 示例:查找所有销售额超过1000美元或位于波士顿的商店: ```sql SELECT * FROM Store_Information WHERE sales &gt; 1000 OR store_name = 'Boston'; ```...

    C语言的32个关键字和9种控制语句

    - **返回语句**: - **return**:用于从函数中返回值,同时结束函数的执行。 ##### 3. 存储类型关键字(4个) - **auto**:声明一个自动变量,即局部变量。 - **extern**:声明一个变量是在其他文件中定义的,...

    ORACLE_UPDATE_语句语法与性能分析

    在这种形式中,我们使用EXISTS子句与一个临时表(tmp_cust_city)进行关联。这允许我们仅更新那些在临时表中存在的记录。这种方式更安全,因为它不会误更新不匹配的数据。同时,由于我们只在WHERE子句中使用关联,...

    JAVA经典语句总结

    只要两个对应位中有一个为1,则结果为1;全为0时,结果为0。 以数字3和6为例: - 数字3的二进制表示为 `0000 0011` - 数字6的二进制表示为 `0000 0110` - 按位与运算的结果为 `0000 0010`,即十进制的2 - ...

    SQL语句大全经典教程

    INTERSECT返回两个查询结果集的交集,而MINUS返回存在于第一个查询结果集但不在第二个查询结果集中的记录。 #### 16. 字符串连接(Concatenate) 字符串连接函数(如CONCAT)用于将多个字符串字段或值合并为一个...

    第6章 流程控制语句1

    - **return**:从函数中返回一个值,结束函数执行。 - **throw**:抛出一个异常,中断程序执行。 - **try...catch...finally**:异常处理结构,尝试执行代码,捕获可能出现的异常,最后可以有一个finally块,无论...

    ElasticSearch查询语句

    **Terms 查询**允许一次指定多个值,只要文档中的字段值与其中一个匹配即可。 ```json GET /blog/blog/_search { "query": { "terms": { "content": ["summary4", "term"] } } } ``` 上述示例表示只要 `...

    第三章java流程控制语句.pptx

    - Return语句:从方法中返回一个值(对于void方法则无返回值),并结束该方法的执行。 6. 常用的程序设计方法 - 枚举法:列举所有可能情况来解决问题。 - 地推法:根据已知的解,推导出未知解。 - 递归法:函数调用...

    SQL常用 语句 教程

    1. **SELECT语句**:这是SQL中最重要的一个语句,用于从数据库中选择并返回所需的数据。基本语法为`SELECT column_name FROM table_name`。例如,如果我们要从名为`Store_Information`的表中获取所有店铺名称,我们...

    Java 零基础控制语句 - switch 语句.md

    - **多 case 值**:可以在一个 `case` 块中指定多个值,只要这些值的处理方式相同即可。例如: ```java case 1: case 2: System.out.println("工作日"); break; ``` - **字符串作为 case 值**:从 Java 7 ...

    ORACLE-SQL语句优化技术分析.docx

    对于海量数据,劣质 SQL 语句和优质 SQL 语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的 SQL 语句,提高系统的可用性。 二、SQL 语句编写注意问题 在编写 ...

    sql语句大全免费教程下载

    AND运算符表示所有条件都必须满足,而OR表示只要满足其中一个条件即可。 5. IN关键字:在WHERE子句中,允许在某个范围内进行条件查询,而不是使用多个OR条件。 6. BETWEEN关键字:用于在一定范围内的值之间进行...

    微软JavaScript手册

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

Global site tag (gtag.js) - Google Analytics