WHAT
雙重否定的條件語句,可以使用一個肯定的條件語句代替
記住:雙重否定 = 肯定
本次重構涉及到的基本重構手法:
- Extract Method(提煉方法)
- Inline Method(内聯方法)
- Substitute Algorithm(替換算法)
WHEN
雙重否定,雖然機器能夠很好了解并正确執行,但是不符合人的自然語言習慣,且令人迷惑,降低代碼可讀性
HOW
重構前的代碼
package remove.doubles.negative;
public class SomeClass {
private boolean found = false;
public boolean isNotFound() {
return !found;
}
public void someMethod() {
if (!isNotFound()) { // double negative
// do something
}
}
public void someMethod2() {
if (isNotFound()) { // negative
// do something else
}
}
}
重構步驟
- 提煉肯定條件方法:選中否定條件方法中的肯定部分(如果現在沒有,替換算法,杜撰一個),使用快捷鍵(Alt + Shitf + M)或者上下文菜單(Refactor -> Extract Method ... ),彈出” Extract Method“對話框
- 方法名取名為:isFound,并選擇Access Modifier為public,提取函數之後的代碼
package remove.doubles.negative;
public class SomeClass {
private boolean found = false;
public boolean isNotFound() {
return !isFound();
}
public boolean isFound() {// extracted positive conditional method
return found;
}
public void someMethod() {
if (!isNotFound()) { // double negative
// do something
}
}
public void someMethod2() {
if (isNotFound()) { // negative
// do something else
}
}
}
- 針對每一個雙重否定條件,将雙重否定改為肯定
- 先内聯否定條件方法:在調用處,選擇否定條件,使用快捷鍵(Alt + Shit + I)或者上下文菜單(Refactor -> Inline...),彈出“Inline Method”對話框,選擇“Only the selected invocation”
- 重構後的代碼
package remove.doubles.negative;
public class SomeClass {
private boolean found = false;
public boolean isNotFound() {
return !isFound();
}
public boolean isFound() {// extracted positive conditional method
return found;
}
public void someMethod() {
if (!!isFound()) { // double negative, after inline method
// do something
}
}
public void someMethod2() {
if (isNotFound()) { // negative
// do something else
}
}
}
-
- 替換算法,把雙重否定改為肯定
package remove.doubles.negative;
public class SomeClass {
private boolean found = false;
public boolean isNotFound() {
return !isFound();
}
public boolean isFound() {// extracted positive conditional method
return found;
}
public void someMethod() {
if (isFound()) { // changed double negative to positive
// do something
}
}
public void someMethod2() {
if (isNotFound()) { // negative
// do something else
}
}
}
- 最後,如果否定條件方法isNotFound(),沒有調用,使用隐藏方法(Hidden Method),或者隻有少數幾個調用,使用内聯方法:Inline method
- 選中 isNotFound方法, 使用快捷鍵(Alt + Shit + I)或者上下文菜單(Refactor -> Inline...),彈出“Inline Method”對話框,選擇“All invocations”,并選擇“Delete method declaration”
重構後的代碼
package remove.doubles.negative;
public class SomeClass {
private boolean found = false;
public boolean isFound() {// extracted positive conditional method
return found;
}
public void someMethod() {
if (isFound()) { // changed double negative to positive
// do something
}
}
public void someMethod2() {
if (!isFound()) { // changed negative to use not positive
// do something else
}
}
}