日期:2014-05-20  浏览次数:20572 次

“恶心代码”帖子中的一个回复
曾在一个帖子中回复过最恶心的代码,摘抄如下:

Java code
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”之类无意义的回复,谢谢配合!

------解决方案--------------------
当初老师教的也是这么说的 for if 循环嵌套不要超过2到3层 
有代码执行效率方面和阅读代码方便的考虑吧
以后继续保持
------解决方案--------------------
确实有些隐患,一些特殊情况下不执行任何代码就跳过了,在后继的代码中不好界定处于什么状态
------解决方案--------------------
Java code
import com.google.common.base.Preconditions.checkNotNull;
public void process(File file){
    checkNotNull(file);
    if(file.isFile() && file.canRead(){
        ...
    }
}

------解决方案--------------------
探讨
确实有些隐患,一些特殊情况下不执行任何代码就跳过了,在后继的代码中不好界定处于什么状态

------解决方案--------------------
checkNotNull很多开源项目的做法是Assert.notNull(file,"参数不能为空");

很多项目中都有自己的Assert类


探讨

Java code
import com.google.common.base.Preconditions.checkNotNull;
public void process(File file){
checkNotNull(file);
if(file.isFile() && file.canRead(){
...
}
}

------解决方案--------------------
是啊!!是初学者
------解决方案--------------------
重构太多会导致混乱的,楼主不要使用这么多嵌套
------解决方案--------------------
使用太多的嵌套是不好 但是有时候需要多层嵌套解决问题更加容易
------解决方案--------------------
嵌套太多了,肯定要重构。
------解决方案--------------------
支持楼主~~
------解决方案--------------------
代码中的 for、if 的嵌套三四层应该是可以接受的吧
只是可以接受,尽量不要这样写就好了
------解决方案--------------------
Java code

//一般我喜欢这么做
public void process(File file) {
        if (file == null)return;
        if(!file.exists())return;
        if(file.isDirectory())return;
        if(!file.canRead())return;
        .....
        doSomething
        .....
    }

------解决方案--------------------
嵌套太多不好
------解决方案--------------------
怎么重构啊?给个例子,莫非就是把几个if弄到一块,弄个&&吗?
探讨
引用:
确实有些隐患,一些特殊情况下不执行任何代码就跳过了,在后继的代码中不好界定处于什么状态

超过的话得想办法重构,怎么重构法?谢谢

------解决方案--------------------
com.google.common.base.Preconditions.checkNotNull
这个类原来是androidSDK里的啊,终于找到了,谢谢,又开眼界了
------解决方案--------------------
大家不要把新手当老手看,他们考虑问题的时候跟我们想的不一样;大家刚出来的时候未必就没写过恶心代码,随着经验的增长,再看以前写的代码,总觉得以前自己好白痴。
------解决方案--------------------