天天看點

Remove Double Negative(去除雙重否定)WHATWHENHOW

WHAT

雙重否定的條件語句,可以使用一個肯定的條件語句代替

記住:雙重否定 = 肯定

本次重構涉及到的基本重構手法:

  1. Extract Method(提煉方法)
  2. Inline Method(内聯方法)
  3. 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“對話框 
    Remove Double Negative(去除雙重否定)WHATWHENHOW
    Remove Double Negative(去除雙重否定)WHATWHENHOW
  • 方法名取名為: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”
      Remove Double Negative(去除雙重否定)WHATWHENHOW
      Remove Double Negative(去除雙重否定)WHATWHENHOW
    • 重構後的代碼 
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”
      Remove Double Negative(去除雙重否定)WHATWHENHOW
      Remove Double Negative(去除雙重否定)WHATWHENHOW

重構後的代碼

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
		}
	}
	
}
           

繼續閱讀