Эти утверждения эквивалентны?
Могу ли я провести рефакторинг, как это, являются ли они эквивалентными, и поэтому предпочтительнее простая и понятная версия кода?
Перед рефакторингом:
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);