【问题标题】:Nested if or code multiple times?嵌套 if 或 code 多次?
【发布时间】:2018-12-01 15:05:03
【问题描述】:

由于我找不到与我的构造相似的问题,所以我要问它。

我有以下代码:

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,如果可能的话,应该避免嵌套。然而,在我的理解中,不要多次使用第一个示例中的相同代码也更简洁。

我的问题是,是否应该避免重复使用相同代码的成本?我在这里询问的是最佳实践/标准,而不是意见。


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

编辑:

在 Lino 的回答和 cmets 的帮助下,我想出了以下构造:

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
                }
            }
        }
    }
}

【问题讨论】:

  • 目前两个 sn-ps 不做同样的事情。在第一个条件中,仅在满足条件 1 和 2 时才执行条件 3 和 4。在第二种情况下,它有些不同,如果条件 2 可以满足,如果 1 和 3 或如果 1 和 4 满足

标签: java multiple-conditions nested-if


【解决方案1】:

假设条件 3 和 4 仅在条件 1 和 2 必须评估为 true 时才执行,那么以下 sn-p 将工作得最好:

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

如果你仍然不喜欢嵌套的 if,你也可以存储来自 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
        }
    }
}

【讨论】:

  • 如果我不想在每次迭代中都执行该部分,我应该如何处理// get a variable for condition2
  • @XtremeBaumer 在迭代之前获取该变量怎么样?如果它不依赖于迭代中的元素,这可能是最好的
  • 但它确实取决于元素,因此我之前无法得到它
  • @XtremeBaumer 来自内部或外部循环的元素?如果它来自外部,您可以在内部循环之前定义它。如果它确实依赖于内部,那么您不会在每次迭代时都调用它
  • @XtremeBaumer 很抱歉让您失望了,但最佳实践仍然基于意见...
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 2015-06-08
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多