[RefactoringToPatterns] 7.4 Replace State-Altering Conditionals with State

此系列文章是我閱讀《Refactoring To Patterns》過程中實際演練的筆記。閱讀過程中發現若沒有相當的 Design Patterns、Refactoring 底子,此書真的不易閱讀,必須伴隨實際操作才能更理解每個步驟具體的方式,故在這記錄之餘也跟各位分享。

書中是使用 Java 的程式碼作為範例,而我比較熟稔 C#,所使用的演練環境為:Visual Studio 2017、ReSharper、VsVim。過程中會因應 ReSharper 的功能,所以有些許的調整以便更「優雅」的進行重構。

此篇是關於 7.4 Replace State-Altering Conditionals with State 的具體演練。

此次的 smaple code 是我建立的,若有錯誤還請多包涵,詳細程式碼請見:https://github.com/mystic01/refactoringtopatterns

以下,請搭配影片閱讀(數字表示影片時間、藍色表示重構技法、紫色表示我的困擾):

  1. 將兩個條件式給抽出為 method,提高可讀性。Extract Method0:00
     
  2. state 的型態由 string 改為 PermissionState1:18
    1. 一樣使用先用再生的技巧,改掉 stringPermissionState,再將其生出
    2. 接著逐一改為 new PermissionState("XXX"),這邊用了一個小技巧。2:10
      先把建構子妥妥的生出來,接著逐一半自動的改為 new PermissionState("XXX")
    3. 把該改的 string 都半自動的換為 PermissionState
  3. 將各個 staticPermissionState 換為對應的 class。4:00
    這邊好像沒有什麼特別的技巧,就逐一改改生生...。
     
  4. 將各個 static PermissionState 搬移(Move To Another Type)到 PermissionState6:45
     
  5. claimBy() 至所有 PermissionState(含其子 class)。7:36
    1. 因為 claimBy() 這個 method 要保留在 SystemPermission 中,所以將其內容抽出為 claimBy2() (避免名稱重複)。
    2. claimBy2() 搬移(Move Instance Method)至 PermissionState
      7:50 這邊有一個極度困擾我的問題,希望有大師可以為我解惑,感激不盡。
      只要使用 
      Move Instance Method,被抽出去 method 所用到的 field 就會再被 Encapsulate 一次。就像影片中,又產出了一個 State1 的 property,但明明就有 State 存在。這個問題後面的步驟還會陸續發生,讓我非常困擾,也 Google 不到解法。

      8:26 困擾之餘,也借影片分享將兩個 Property 改回同一個的方式。硬是將 State1 rename State 是行不通的(會發生衝突,導致呼叫端還是會保留在 State1)。我是先把 State 改為 StateXXXX (非rename),再把 State2 rename State,此時就不會發生衝突,接著刪掉其中一個 State如果有更好的方式也請告訴我,希望可以忽略衝突強制 rename...。
       
    3. claimBy2() 改名回 claimBy()
    4. 將 claimBy() 移到(Push Members Down)該放置的子 class(兩個 Requested 相關 class)。Push Members 的動作就帶有複製的意思,超棒的。
    5. 跳至錯誤處,半自動的在 PermissionState 生出 abstractclaimBy()
    6. 逐一跳至錯誤處,逐一處理 override、implement claimBy(),也同時刪除不必要的判斷邏輯。
       
  6. 仿照上述 claimBy() 的方式依序處理 grantBy()denideBy()10:57
     
  7. 整理程式,將各 class 搬移至各檔案,打完收工!!18:40

 


其他 Refacotirng To Patterns 影片請見:Refactoring To Patterns
不堪入目的練功過程:Refactoring To Patterns (exercise)