免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4588 | 回复: 21
打印 上一主题 下一主题

好的代码里只要一个return语句(转一口水贴) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-24 09:57 |只看该作者 |倒序浏览
本帖最后由 2009从-1开始 于 2011-03-24 09:58 编辑

好的代码里只要一个return语句

http://sd.csdn.net/a/20110323/294448.html

导读:原文根据作者Jasone Tee在theserverside.com上发表的一篇《A return to Good Code》 翻译而来。译文来自外刊IT评论《只要一个返回语句》。

内容如下:

别再这样写了:

  1. public boolean foo() {
  2. if (true) {
  3.    return true;  
  4. }  else {  
  5. return false;  
  6. }
  7. }
复制代码
每次当我深入某个开源项目,看到大概是某个专家写的、并被有经验的专业人士审查过的这样的代码,我都会惊讶不已,竟然没有人去阻止这个开发者在这个方法里胡乱的放置返回语句。

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

  1. public boolean foo() {  
  2. boolean flag = true;  
  3. if (true) {
  4.    flag=true;
  5. }  
  6. else {
  7.    flag=false;
  8. }
  9. return flag;
  10. }
复制代码
这是Java基本常识。实际上,这不仅是Java基本常识,这是小学水平的Java知识。如果你的方法返回一个值,你应该在方法的开始处把它声明做 一个变量。然后再去做一些赋予这个变量正确意义的操作。然后,在你的最后一行,把这个变量返回给调用程序。这样做不仅仅是为写出好的代码,这是一种有教养 的表现。

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

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

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

论坛徽章:
0
2 [报告]
发表于 2011-03-24 09:59 |只看该作者
我不认同这个观点

论坛徽章:
0
3 [报告]
发表于 2011-03-24 10:00 |只看该作者
这样的话,还不如goto呢

论坛徽章:
0
4 [报告]
发表于 2011-03-24 10:03 |只看该作者
回复 3# jnjn999


你是支持题目观点吧?
goto还是不同些吧。。

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
5 [报告]
发表于 2011-03-24 10:03 |只看该作者
不认同 + 1

按这个观点,break、continue也可以去掉了,全换成flag。

论坛徽章:
0
6 [报告]
发表于 2011-03-24 10:07 |只看该作者
不认同++

flag不易于阅读代码,在OO语言中。
多出口函数没有必要全盘否决。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
7 [报告]
发表于 2011-03-24 10:08 |只看该作者
我还是比较支持的

论坛徽章:
0
8 [报告]
发表于 2011-03-24 10:08 |只看该作者
本帖最后由 zhangsuozhu 于 2011-03-24 10:15 编辑

我喜欢的方法如下两种:

  1. function ()
  2. {
  3.     if(  xxx==false)
  4.               return -1;
  5.     if ( yyyy == false)
  6.               return -1;
  7.    
  8.      ........

  9.      return 0;

  10. }

  11. function ()
  12. {
  13.     if (xxxx==false)
  14.         goto false_process;
  15.     if (yyyy==false)
  16.         goto false_process;
  17.     .....
  18.     return 0;
  19. false_process:
  20.     .......
  21.     return -1;
  22. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2011-03-24 10:12 |只看该作者
回复 8# hellioncu


    我不认同主要是觉得一些业务的逻辑,用太多ifelse很乱啊

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
10 [报告]
发表于 2011-03-24 10:15 |只看该作者
想辦法把函數寫短點。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP