“恶心代码”帖子中的一个回复

火龙果被占用了 2011-10-30 01:30:09
曾在一个帖子中回复过最恶心的代码,摘抄如下:

public void process(File file) {
if (file != null) {
if (file.exists()) {
if (!file.isDirectory()) {
if (file.canRead()) {
// do something;
}
}
}
}
}


详见下面这个帖子 23 楼的回复:

你见过最恶心的代码是什么样子的?
http://topic.csdn.net/u/20111020/16/e04cf593-4789-418b-8142-88c231002402.html

本来准备睡觉的,刚才翻了一下这个帖子,得,没法睡了,得发帖子了!

打 23 楼后,回复的同学竟然都异口同声地表明这代码没有问题!

我一直告诫组员,代码中的 for、if 的嵌套不应该超过两层,超过的话得想办法重构。从那个帖子的回复来看,难道是我错了?抑或是我太敏感,还是这个代码真的没有问题?

纯技术帖,谢绝“顶”、“Mark”之类无意义的回复,谢谢配合!
...全文
6620 198 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
198 条回复
切换为时间正序
请发表友善的回复…
发表回复
a395885670 2012-02-27
  • 打赏
  • 举报
回复
[Quote=引用 83 楼 lxbccsu 的回复:]

引用 32 楼 healer_kx 的回复:
引用 31 楼 simonyeung 的回复:

...

我很难在10秒钟内读懂

Yup.这个示例 楼主说的“恶心”写法更清晰

面向对象编程是很强调 可读性 和 可维护性。

个人倾向于提炼方法的做法(放哪里你知道的):
Java code

public void process(File file) {
……
[/Quote]

喜欢你的这种编码方式
xiongyu2006 2011-12-06
  • 打赏
  • 举报
回复
if嵌套多了真的很悲剧
liuyuhua0066 2011-11-08
  • 打赏
  • 举报
回复
华为的编程规范(4Java)里面貌似有一条:

复杂度 建议的最大规模
return语句 1个
[Quote=引用 146 楼 bao110908 的回复:]
我不知道谁会有这样的观点,为什么要制定这样的观点?
[/Quote]
hongbowu 2011-11-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zhou__jh 的回复:]

当初老师教的也是这么说的 for if 循环嵌套不要超过2到3层
有代码执行效率方面和阅读代码方便的考虑吧
以后继续保持
[/Quote]

一个双重循环加上一个比较就是3层。
是不是也要重构一下?
小绵羊 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 185 楼 guanghuan 的回复:]

引用 183 楼 zherriahaizer 的回复:
这样的代码清晰?你是学美术排版的么?
对于程序而言,简化的代码最美观!下面5个{你觉得美观么?
我们的老师教的时候强调过for、if不能超3重,否则会很占用资源
用&&连接,就很难看么?还需要反应?ok,证明你学的不够熟练~~
用&&+注释的方法我感觉不错,防御式我承认我不懂~~


排版好绝……
[/Quote]
比較贊同這個觀點
if,for之類的不能超過3重不知道是誰說的,為什麼不能超過3層?誰給解釋解釋?

個人認為
if(xxx)return;之類的代碼比多層循環更噁心。
Tz_Sword 2011-11-04
  • 打赏
  • 举报
回复

//可以

if (file != null && file.isFile() && file.canRead()) {
// do something;
}else
{
throw .....
}

kickxxx 2011-11-04
  • 打赏
  • 举报
回复
[Quote=引用 192 楼 x19881216 的回复:]

引用 185 楼 guanghuan 的回复:

引用 183 楼 zherriahaizer 的回复:
这样的代码清晰?你是学美术排版的么?
对于程序而言,简化的代码最美观!下面5个{你觉得美观么?
我们的老师教的时候强调过for、if不能超3重,否则会很占用资源
用&&连接,就很难看么?还需要反应?ok,证明你学的不够熟练~~
用&amp……
[/Quote]

这个是个人习惯,如果代码自己看着顺眼并且只给自己看,写十层也没关系。
但是将来要给别人维护,或者代码还有其他人也在修改,就要考虑别人的感受,这里的三重,也许就是考虑大部分人忍受的界限吧。
Dong Guo 2011-11-04
  • 打赏
  • 举报
回复
这个不算最狠的,今年暑假和同学作一个android软件,别人写的代码,我拿来一看,擦!十重嵌套,当时就晕了~~~
hzhz373241000 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 simonyeung 的回复:]

Java code

if (file != null && file.exists() && !file.isDirectory() && file.canRead())
[/Quote]

当file==null 判断后面条件的时候不会报错么
zealotcq 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 172 楼 shanmao 的回复:]
此处写个isFileValid之类的函数对性能的影响肯定会很大,函数调用压栈消耗远比几个if要费,除非这个判断会经常使用。
[/Quote]

这个观念是错误的,函数调用的开销是很小的,和函数体里的io操作比较就更小了,
只有在函数体很简单,而且这段代码要循坏调用很多次的时候,才会考虑函数开销的问题,比如排序算法
for。。。
for。。。
swap(a,b); //应该换成内联函数或者直接把代码放在循环里,执行效率能提高几倍
但是这种情况实际开发中真的很难遇到,老是抱着函数开销很大的观念,就会干出写一个主函数几w行代码的事,应该更新一下观念了
  • 打赏
  • 举报
回复
换上我们经理扇你两巴掌,怎么能写出这么垃圾的狗屎代码!必须重构!
ilrxx 2011-11-03
  • 打赏
  • 举报
回复
重构啊重构,其实当我们写东西太绕的时候都应该启动自我警告了,觉得绕就把绕的部分看是否能抽离出一个方法,方法多了找共同点看是否能抽离出一个commonClass,就是这样吧。。
shanmao 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 169 楼 bao110908 的回复:]

引用 156 楼 zealotcq 的回复:

是lz太敏感了
”我一直告诫组员,代码中的 for、if 的嵌套不应该超过两层,超过的话得想办法重构“
适用于嵌套内的代码很复杂的情况,嵌套多了可读性很差,楼上有人举了这样一个例子
lz的例子,条件很简单也有明显的前后关系,又有缩进,正常人都可以一眼看明白这个代码逻辑,所以这样写显然没什么问题
当然用个isFileValid之类的函数包……
[/Quote]

此处写个isFileValid之类的函数对性能的影响肯定会很大,函数调用压栈消耗远比几个if要费,除非这个判断会经常使用。
shanmao 2011-11-03
  • 打赏
  • 举报
回复
其实这样写问题不大,逻辑很清楚,执行的优先顺序也很明确,无非就是多个if嵌套时执行效率低点,但绝对是小数点后6位以上的性能影响,可以容忍。如果非要说优化,也只能说是把判断条件写到一个if中用&&连起来,但这样代码的阅读性反倒降低,得不偿失。一般情况下这种代码编译器会替你优化的。程序员写程序首先是给人读的,捎带着能在机器上运行而已。
fainfy 2011-11-03
  • 打赏
  • 举报
回复
why?
此帖如此之火?
望舒 2011-11-03
  • 打赏
  • 举报
回复
嵌套好玩啊
makingjc 2011-11-03
  • 打赏
  • 举报
回复
这贴好多人关注呢。
Guanghuan 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 183 楼 zherriahaizer 的回复:]
这样的代码清晰?你是学美术排版的么?
对于程序而言,简化的代码最美观!下面5个{你觉得美观么?
我们的老师教的时候强调过for、if不能超3重,否则会很占用资源
用&&连接,就很难看么?还需要反应?ok,证明你学的不够熟练~~
用&&+注释的方法我感觉不错,防御式我承认我不懂~~
[/Quote]

排版好绝对让你好懂,这个不要否认。
至于if好懂,还是&&好懂,那是个人习惯,我不争论。于我而言不会拘泥那种,类似的比较条件我会用&&,差异较大的比较条件,我分开用if。
for、if不能超3重,这种死杠杠,根本要不得,那是看实际情况而定的。不信,你自己看linux的内核代码,超过3重的比比皆是。如果是x264、gsoap这种逻辑复杂的代码,超过6、7重的都有。如果你只用3重就满足了,只能说你写的代码太简单。嵌套重数自然是少些好,但是更关键是看单个逻辑的复杂程度,如果为了少于3重,硬生生把单个逻辑拆得支离破碎,最终得不偿失。


ZherriaHaizer 2011-11-03
  • 打赏
  • 举报
回复
[Quote=引用 181 楼 guanghuan 的回复:]
这样的代码没有问题,非常清晰。一看看懂。
如果用&&连接,反而稍微看一下才看懂。
至于是if (xxx) return;的方法,还好你是java,搁C/C++里,后面如果有释放内存的代码就不执行了,等着内存泄露吧。

当然太多重嵌套不好,用一个函数检查文件可用性更好些。但楼上的代码远说不上恶心,比某些以为巧妙却没人看懂的代码好多了,那才叫恶心。
[/Quote]

这样的代码清晰?你是学美术排版的么?

对于程序而言,简化的代码最美观!下面5个{你觉得美观么?

我们的老师教的时候强调过for、if不能超3重,否则会很占用资源

用&&连接,就很难看么?还需要反应?ok,证明你学的不够熟练~~

用&&+注释的方法我感觉不错,防御式我承认我不懂~~
xiaohuanjie 2011-11-03
  • 打赏
  • 举报
回复
加载更多回复(170)

62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧