分组测试或将它们分开是否更简单?

时间:2010-09-02 18:48:28

标签: language-agnostic coding-style

我刚与同事讨论过,我们不同意以下哪些代码段更简单:

public boolean foo(int x, int y) {
    if (x < 0)
        return false;
    if (y < 0)
        return false;
    // more stuff below
}

OR

public boolean foo(int x, int y) {
    if (x < 0 || y < 0)
        return false;
    // more stuff below
}

显然哪个更短;很明显,他们的cyclomatic complexity是相同的(因此对于“简单”的定义,当然,它们是相同的)。

你有什么感受,为什么?哪个更具可读性;哪个更容易调试?

5 个答案:

答案 0 :(得分:4)

在你描述的完全通用的情况下,我会选择第二个,因为我讨厌重复代码。

但在现实生活中,我会根据两项测试是否相关来做出决定。

例如

if (user.isDisabled() || user.isSuspended())
    return false;

两个测试都是关于用户是否可以做某事。

if (user.isDisabled())
    return false;
if (catalog.isClosedForOrders()) 
    return false;

一个测试是关于用户,一个是关于系统;为了便于维护,我将它们分开,以便以后能够独立改变。

答案 1 :(得分:1)

那么,在很大程度上取决于我当时的心情。

我认为最客观的考虑因素是x&amp; amp;年。检查一个变量是否为高和低;低范围 - 一个如果。检查一个字符串是否为null,一个int是否为范围 - 两个ifs。

答案 2 :(得分:0)

我会选择第二个,只有一个变化:

public boolean foo(int x, int y) {
    if ((x < 0) || (y < 0))
        return false;
    // more stuff below
}

原因在于它遵循人类用自然语言表达的方式(我们会说“如果两者中的任何一个是否定的,那么答案就是'不'”而不是“如果第一个是否定,答案是'不';如果第二个是否定的,答案也是'不'“。

答案 3 :(得分:0)

我认为这些风格提出了不同的建议:

if (x < 0)
    return false;
if (y < 0)
    return false;

如果x < 0完成了y < 0其他事情,则表示已完成某项工作。

if (x < 0 || y < 0)
    return false;

暗示如果其中一个条件为真,则完成一件事。

所以这取决于实际的代码。显然,如果两个表达式都应该这样做,你就不会拆分语句,因为这会导致代码重复,只会感觉错误

答案 4 :(得分:0)

更好的名字,然后真的很清楚......

public boolean foo(int x, int y) {
    var hasInvalidArgument = (x < 0 || y < 0);

    if (hasInvalidArgument)
        return false;

    // more stuff below
}

您不需要查看表达式......变量名称告诉您测试是什么