Эти утверждения эквивалентны?

Могу ли я провести рефакторинг, как это, являются ли они эквивалентными, и поэтому предпочтительнее простая и понятная версия кода?

Перед рефакторингом:

    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 ответа

Решение

Нет, они не эквивалентны. Вы должны добавить ! перед вторым вариантом.

Фиксированный второй вариант более понятен:

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;

Вообще-то, нет. Первый true только когда все совпадения не совпадают. Если все совпадения не совпадают во втором утверждении, вы возвращаете false

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

Это правильно

Нет, это не эквивалентно. Сократите его немного, чтобы он стал понятнее - давайте используем всего 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);
Другие вопросы по тегам