if-continue 与嵌套 if
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-trees,BSP等
Are there any side effects that I'm unwittingly invoking by using the first rather than the second?
两者都很好,我看不出有任何明显的优势。
但是如果你是认真的并且想做一些高效的事情(例如在一个有数万个对象的 3D 世界中一致地检查碰撞),你会看树。特别是quad-tree。这就是游戏实际进行碰撞检测的方式。
如果你在学校学习游戏,这是一个相当大的话题。
我正在实施一些碰撞检测。随着时间的推移,随着项目复杂性的增加,我不断地添加额外的检查,无意中发现了如下所示的模式:
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-trees,BSP等
Are there any side effects that I'm unwittingly invoking by using the first rather than the second?
两者都很好,我看不出有任何明显的优势。
但是如果你是认真的并且想做一些高效的事情(例如在一个有数万个对象的 3D 世界中一致地检查碰撞),你会看树。特别是quad-tree。这就是游戏实际进行碰撞检测的方式。
如果你在学校学习游戏,这是一个相当大的话题。