Java 这些陈述是等价的吗?
我可以这样重构吗?这些是等价的,因此更简单的straighforward版本的代码是首选的吗 重构之前:Java 这些陈述是等价的吗?,java,refactoring,boolean-logic,demorgans-law,Java,Refactoring,Boolean Logic,Demorgans Law,我可以这样重构吗?这些是等价的,因此更简单的straighforward版本的代码是首选的吗 重构之前: if (!matcher.matches() && !matcher2.matches() && !matcher3.matches() && !matcher4.matches() && !matcher5.matches() && !matcher6.m
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())
重构后:
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())
不,它们不是等价的。您必须添加
代码>位于第二个选项前面
固定的第二个选项更明确:
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())
这是正确的不,这些不是等效的。将其缩减一点以便更清晰-让我们仅使用两个示例,并将它们设为x和y,而不是“matcherX.matches()”。在这种情况下,你会问:
这两个相等吗
if (!x && !y) {
return true;
} else
return false;
及
让我们慢慢来。首先,初始语句可以直接转换为
return (!x && !y);
以下是解决这一问题的方法:
| x | y | !x && !y |
+---------+---------+------------+
| T | T | F |
| T | F | F |
| F | T | F |
| F | F | T |
也就是说,只有当所有子表达式均为true时,第一个表达式才会返回true
。那跟
return !(x || y);
是的,差不多:(你可能需要在最后应用一个额外的反转。我还没有检查。)事实上,任何有价值的IDE都会为你执行重构。Eclipse使用Ctrl+1,IntelliJ使用Alt+Enter