1. 程式人生 > >重構之在物件之間搬移特性

重構之在物件之間搬移特性

/**
 * 7. 在物件之間搬移特性 類往往會因為承擔過多的責任 而變得臃腫不堪 
 * 7.1 Move Method(搬移函式) 1.
 * 在該函式最常引用的類中建立一個有著類似行為的新函式,將舊函式變成一個單純的委託函式,或者將舊函式 完全移除。 2.搬移函式是
 * 重構理論的支柱,或者如果一個類與另一個類有太多合作而形成高度耦合,我就會搬移函式。
 *  7.2 Move Field(搬移欄位)
 * 在目標類新建一個欄位,修改源欄位所有使用者,令它們改用新欄位。
 * 1.如果我發現,對於一個欄位,在其所駐類之外得另一個類中有更多函式使用了它,我就會考慮搬移這個欄位。
 *  7.3 Extract Class(提煉類)
 * 建立一個新類,將相關的欄位和函式從舊類搬移到新類。 1.你也許聽過類似這樣得教誨,一個類應該是一個清楚得抽象,處理一些明確得責任。 2.及類 拆分為 2個
 * 類,執行不同得責任。(不同的類,含有不同得欄位,函式。)
 *  7.4 Inline Class(將類內聯化) 與7.3完全相反 
 *  7.5 HideDelegate(隱藏“委託關係”) 
 *   客戶通過一個 委託類 來呼叫另一個物件。在服務類上建立客戶所需得所有函式,用以隱藏委託關係。
 * 如果某個客戶先通過服務物件得欄位得到另一個物件,然後呼叫後者得函式,那麼客戶就必須知曉
 * 這一層委託關係,萬一委託關係發生變化,客戶也得相應變化。可以在服務物件上放置一個簡單得委託函式, 將委託關係隱藏起來,從而去除這種依賴。
 * 7.6 Remove Middle Man (移除中間人)
 *  某個類做了過多得簡單委託動作,讓客戶直接呼叫受託類。
 *   和 7.5 恰好相反。
 * 7.7 Introduce Foreign Method 引入外加函式
 *  你需要 為提供服務得類增加一個函式,但你無法修改這個類。在客戶類中建立一個函式,並以第一引數形式傳入一個服務類例項。
 * 7.8 Introduce Local Extension(引入本地擴充套件) 
 * 你需要為服務類提供一些額外函式,但你無法修改這個類。
 * 建立一個新類,使它包含這些額外函式,讓這個擴充套件品成為源類得子類或包裝類。
 *  即將 外加函式 封裝到一個類中
 * 
 *  
 *    
 * 
 * 
 * 
 * 
 */
class Test {
	// ********************搬移函式***************************
	int gamma(int code1, int code2, int code3) {
		int value1 = (code1 * code2) + delta();
		int value2 = (code1 + code2) + 100;
		if ((code3 - value1) > 100) {
			value2 = 20;
			int value3 = value2 * 7;
			return value3 - 2 * value1;
		}
		return value2;

	}

	int delta() {
		return 1;
	}

}

// 將 Account 函式 搬移到 Test
class Account {
	// 重構前
	int gamma(int code1, int code2, int code3) {
		int value1 = (code1 * code2) + delta();
		int value2 = (code1 + code2) + 100;
		if ((code3 - value1) > 100) {
			value2 = 20;
			int value3 = value2 * 7;
			return value3 - 2 * value1;
		}
		return value2;

	}

	int delta() {
		return 1;
	}

	// 重構後
	void nnn() {
		new Test().gamma(1, 2, 3);

	}
	// *************************隱藏“委託關係”****************************
}

// 部門類
class Department {
	private String code;
	private Person manager;

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public Person getManager() {
		return manager;
	}

	public void setManager(Person manager) {
		this.manager = manager;
	}
}

// 人
class Person {
	Department department;

	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}

	// 隱藏委託關係
	public Person getManagerYY() {
		return department.getManager();
	}

	//
	public static void main(String[] args) {
		// 客戶 希望知道某人得經理是誰,必須這樣呼叫,但是客戶是不需要知道工作原理得。,我們可以隱藏委託關係。
		Person manager = new Person();
		manager.getDepartment().getManager();
		// 重構後
		manager.getManagerYY();
//		***************引入外加函式*****************
		int year = 0;
		int month = 0;
		int date1 = 0;
		Date date = new Date( year,  month,  date1);
//		***************引入外加函式:重構後*****************	
		Date date2=newDay(year, month, date1);
	}

	private static Date newDay(int year, int month, int date) {
		
		return new Date( year,  month,  date);
	}
//	***************引入本地擴充套件*****************
	class myDdate extends Date {
		public Date newDate(int year, int month, int date) {
			return new Date( year,  month,  date);	
		}
	}
}