重構之在物件之間搬移特性
阿新 • • 發佈:2018-11-13
/** * 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); } } }