这些陈述是否相同?

时间:2012-09-14 06:32:24

标签: java refactoring boolean-logic demorgans-law

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

重构之前:

    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()) 

3 个答案:

答案 0 :(得分:6)

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

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

这是正确的

答案 1 :(得分: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;

答案 2 :(得分:0)

不,这些不等同。稍微削减它以便更清楚 - 让我们只使用2个示例,并将它们设为x和y而不是“matcherX.matches()”。在那种情况下,你问:

这两个是等价的吗?

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

return (x || y);

让我们轻松进入它。首先,初始陈述可以直接转换为

return (!x && !y);

以下是Truth Table

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

也就是说,只有当没有子表达式为真时,第一个表达式才返回true。这与

相同
return !(x || y);