4

我可以像这样重构吗,这些是等价的,因此更简单的代码版本是首选吗?

重构前:

    if (!matcher.matches() && !matcher2.matches() && !matcher3.matches()
            && !matcher4.matches() && !matcher5.matches()
            && !matcher6.matches() && !matcher7.matches()
            && !matcher8.matches()) {
        return true;
    } else
        return false;

重构后:

    return (matcher.matches() || matcher2.matches() || matcher3.matches()
            || matcher4.matches() || matcher5.matches()
            || matcher6.matches() || matcher7.matches()
            || matcher8.matches()) 
4

3 回答 3

6

实际上,没有。第一个是true仅当所有匹配器都不匹配时。如果第二个语句中的所有匹配器都不匹配,则返回false

return !(matcher.matches() || matcher2.matches() || matcher3.matches()
            || matcher4.matches() || matcher5.matches()
            || matcher6.matches() || matcher7.matches()
            || matcher8.matches()) 

这是对的

于 2012-09-14T06:35:44.277 回答
2

不,它们不相等。您必须!在第二个选项前面添加。

固定的第二个选项肯定更清楚:

return !(matcher.matches() || matcher2.matches() || matcher3.matches()
            || matcher4.matches() || matcher5.matches()
            || matcher6.matches() || matcher7.matches()
            || matcher8.matches()) 

我也会这样重构它:

boolean atLeastOneMatch = matcher.matches() || matcher2.matches() || matcher3.matches()
                || matcher4.matches() || matcher5.matches()
                || matcher6.matches() || matcher7.matches()
                || matcher8.matches();

return !atLeastOneMatch;
于 2012-09-14T06:33:59.727 回答
0

不,这些不是等价的。将其缩减一点,以便更清楚 - 让我们仅使用 2 个示例,并将它们设为 x 和 y 而不是“matcherX.matches()”。在这种情况下,您要问:

这两个是等价的吗?

if (!x && !y) {
        return true;
    } else
        return false;

return (x || y);

让我们轻松进入它。首先,初始语句可以清楚地直接转换为

return (!x && !y);

这是真值表

|    x    |    y    |  !x && !y  |
+---------+---------+------------+
|    T    |    T    |     F      |
|    T    |    F    |     F      |
|    F    |    T    |     F      |
|    F    |    F    |     T      |

也就是说,第一个表达式true仅在没有子表达式为真时返回。那是一样的

return !(x || y);
于 2012-09-14T12:41:33.030 回答