if-continue vs nested if



我正在实现一些碰撞检测。随着时间的推移,随着项目复杂性的增加,我不断添加额外的检查,无意中发现了如下模式:

for (GameObject o1 : collisionObjects) {
    for (GameObject o2 : collisionObjects) {
        if(o1 == o2){
            continue;
        }
        if(!(o1.isSolid() && o2.isSolid())){
            continue;
        }
        //several more checks
        //all of the early-out conditions are passed so do
        //do some intersection checks here
    }
}

稍后查看整个累积的代码,我想如果要重构它,我会使用嵌套的ifs:

for (GameObject o1 : collisionObjects) {
    for (GameObject o2 : collisionObjects) {
        if(o1 != o2){
            if(o1.isSolid() && o2.isSolid()){
                 //all conditions are met so do collision detection
            }
        }
    }
}

从可读性的角度来看,我非常喜欢第一个例子,因为它清楚地分解了所有条件,并且没有给我留下一组嵌套的if。从效率的角度来看,第一种需要每次进行更多的比较。

以下哪种方法更好?我使用第一个而不是第二个会无意中产生副作用吗?

如果你担心第一个需要更多的检查,为什么不否定你的逻辑,把第二个If语句折叠到第一个呢?例如

if(o1 != o2 && o1.isSolid() && o2.isSolid()) {
    // extra stuff
}

对于布尔逻辑的惰性分析,一旦达到false,语句就会失败。

如果你关心性能,我认为研究碰撞检测策略更重要。例如,Oct树、BSP等。

我使用第一个而不是第二个会无意中产生副作用吗?

两者都很好,我看不出其中一个比另一个有什么显著的优势。

但若你们是认真的,并且想做一些高效的事情(例如,在一个有成千上万个物体的3D世界中,要始终如一地检查碰撞),你们会看到树。特别是四叉树。游戏就是这样进行碰撞检测的。

如果你在学校学习游戏,这是一个相当大的话题。

最新更新