嵌套 if 或代码多次?

Nested if or code multiple times?

由于找不到与我的构造类似的问题,所以我要问一下。

我有以下代码:

for (Object o : array1) {
    for (Object o2 : array2) {
        if (condition1) {
            //get a variable for condition2 (depends on iteration elements)
            if (condition2) {
                if (condition3) {
                    //do something
                } else if (condition4) {
                    //do something
                }
            }
        }
    }
}

我也可以写成

for (Object o : array1) {
    for (Object o2 : array2) {
        if (condition1 && condition3) {
            // get a variable for condition2 (depends on iteration elements)
            if (condition2) {
                // do something
            }
        } else if (condition1 && condition4) {
            // get a variable for condition2
            if (condition2) {
                // do something
            }
        }
    }
}

这将以相同的方式工作。在第一个示例中,我尝试尽可能多地使用代码,而在第二个示例中,我不得不多次使用相同的代码。

现在我读到 on this question,应该尽可能避免嵌套。然而,根据我的理解,不要像第一个示例中那样多次使用相同的代码也更清晰。

我的问题是,是否应该避免嵌套多次使用相同代码的成本?我在这里问的是最好的 practices/standards,而不是意见。


我知道我可以将它移到一个单独的方法中,但最终我可能会有大约相同数量的代码。

编辑:

在 Lino 的回答和评论的帮助下,我提出了以下结构:

for (Object o : array1) {
    // get a variable for condition2 (depends on iteration elements)
    if (condition2) {
        for (Object o2 : array2) {
            if (condition1) {
                if (condition3) {
                    // do something
                } else if (condition4) {
                    // do something
                }
            }
        }
    }
}

假设条件 3 和 4 仅在条件 1 和 2 的计算结果必须为 true 时才执行,那么以下代码段最有效:

for (Object o : array1) {
    for (Object o2 : array2) {
        if (condition1 && condition2) {
            if (condition3) {
                //do something
            } else if (condition4) {
                //do something
            }
        }
    }
}

如果您仍然不喜欢嵌套的 ifs,您也可以存储 condition1 && condition2:

的结果
for (Object o : array1) {
    for (Object o2 : array2) {
        final boolean condition1And2 = condition1 && condition2;
        if (condition1And2 && condition3) {
             //do something
        } else if (condition1And2 && condition4) {
             //do something
        }
    }
}