標籤:

《重構》--- 對象間搬移特性

  • Move Method(搬移函數)

    • 程序中,有個函數與其所駐 class 之外的另一個 class 進行更多的交流:調用後者,或被後者調用。在該函數最常引用(指涉)的 class 中建立一個有著類似行為的新函數。將舊函數變成一個單純的委託函數,或是將舊函數完全移除。
    • 一個 class 與另一個 class 有太多合作而形成高度耦合,就進行搬移函數。
    • 根據這個函數與哪個對象的交流比較多,決定其移動路徑。
  • Move Field(搬移值域)

    • 程序中,某個 field 被其所駐 class 之外的另一個 class 更多地用到。在 target class 建立一個new field,修改使用 source field 的所有用戶,令它們改用此 new field。
    • 對於一個 field,在其所駐 class 之外的另一個 class 中有更多函數使用了它,我就會考慮搬移這個field。所謂『使用』可能是通過設值/取值函數間接進行。
    • 可以移動使用該 field 的函數,這取決於是否需要保持介面不受變化。如果這些函數看上去很適合待在原地,就選擇搬移 field。
  • Extract Class(提煉類)

    • 某個 class 做了應該由兩個 classes 做的事。建立一個新 class,將相關的值域和函數從舊 class 搬移到新 class。
    • 一個 class 應該是一個清楚的抽象,處理一些明確的責任。
    • 如果你發現子類化隻影響 class 的部分特性,或如果你發現某些特性需要以一種方式子類化,某些特性需要以另一種方式子類化,就意味著需要分解原來的 class。
  • Inline Class(將類內聯化)

    • 某個 class 沒有做太多事情(沒有承擔足夠責任)。將 class 的所有特性搬移到另一個 class 中,然後移除原 class。
  • Hide Delegate(隱藏委託關係)

    • client 通過一個委託類來調用另一個對象,那麼需要在 server 端建立 client 需要的函數,用以隱藏委託關係。
    • client 需要通過 server 返回的對象的欄位得到另一個對象,然後調用後者的函數,那麼這層邏輯關係需要放在 server 端

class Person {n Department _department;nn public Department getDepartment() {n return _department;n }n public void setDepartment(Department arg) {n _department = arg;n }n}nnclass Department {n private String _chargeCode;n private Person _manager;nn public Department (Person manager) {n _manager = manager;n }nn public Person getManager() {n return _manager;n }n重構前nmanager = john.getDepartment().getManager();n重構後nclass Department {n private String _chargeCode;n private Person _manager;nn public Department (Person manager) {n _manager = manager;n }nn public Person getManager() {n return _department.getManager();n }nmanager = john.getManager();n

  • Remove Middle Man(移除中間人)

    • 某個 class 做了過多的簡單委託動作,那麼讓 client 直接調用受託類。
  • Introduce Foreign Method(引入外加函數)

    • 使用的 server class 需要一個額外函數,但你無法修改這個class, 那麼在 client class 中建立一個函數,並以第一參數的形式傳給 server class。

Date newStart = new Date (previousEnd.getYear(),n previousEnd.getMonth(), previousEnd.getDate() + 1);n重構後nDate newStart = nextDay(previousEnd);nprivate static Date nextDay(Date arg) {n return new Date (arg.getYear(),arg.getMonth(), arg.getDate() + 1);n}n

  • Introduce Local Extension(引入本地擴展)

    • 使用的 server class 需要一些額外函數,但你無法修改這個 class, 可以建立一個新 class,使它包含這些額外函數。讓這個擴展品成為 source class 的子類或包裝類。

推薦閱讀:

讀書001《激蕩三十年》
讀書002《投資哲學》
Only for.../Only on... 與獨佔的迷思
美國是如何保護兒童的?

TAG:杂谈 |