iT邦幫忙

2025 iThome 鐵人賽

DAY 9
0
Software Development

沒測試也敢重構?IDE 安全重構 30 日生存指南系列 第 9

Day 9. Extract Class:分裂出專屬的職責

  • 分享至 

  • xImage
  •  

前幾天我們經歷了 Extract Method/FunctionExtract Variable,知道怎麼從肥大的方法中拆出邏輯,當這些獨立的邏輯一個個被分離出來後,程式碼會漸漸地浮現一些形狀,例如:加解密用的、訂單用的、驗證用的或存取用的等等,這時就是依照職責抽取類別的好時機。

來看看前幾天的例子。那時從一個 GetOrders 的 API 中分離出了一個解密專用的方法。有可能我們需要針對它做單元測試、或是未來另外一個 controller 也會用到,感覺解密的邏輯放在 controller 中實在很彆扭。
https://ithelp.ithome.com.tw/upload/images/20250923/20169414acE4wIHjKi.png

我把游標定位到 Decrypt 方法上,按下 Refactor This 看看有什麼可以做的。看來 Extract Class 正是我需要的,按下去!
https://ithelp.ithome.com.tw/upload/images/20250923/20169414m1BTeC3Xsi.png

接著來為即將拆出的類別取名字......怎麼有一些紅色的警告,感覺有點怕怕的。右下的警告說我的方法在拆出去後會不能存取,原因是這個方法在原本的類別是 private,Rider 不會自動幫我轉換存取權。
https://ithelp.ithome.com.tw/upload/images/20250923/20169414F0RQ8v62bv.png

於是我把它設定成 public。
https://ithelp.ithome.com.tw/upload/images/20250923/20169414kBKBME9txB.png

左上的警告也是類似的問題,新的類別拆出去後,便無法存取原類別的 private 欄位。這次我採取另一個策略,先暫停抽類別,把 _privateKey 先改成用參數注入的方式。這要使用還沒提到的 Introduce Parameter
https://ithelp.ithome.com.tw/upload/images/20250923/20169414TqfzX1pJRe.png

一路按下去後,可以看到 _privateKey 已經變成用參數引用了,這樣新類別就不會依賴於原類別。
https://ithelp.ithome.com.tw/upload/images/20250923/20169414aKDIm1ODF1.png

這次沒有警告了,按下 Next!
https://ithelp.ithome.com.tw/upload/images/20250923/2016941458W9Rg2ISO.png

成功,我們拆出了一個 RsaHelper 類別來專門處理 Rsa 的加解密。稍微細心的人會注意到,因為先前勾的選項,新類別還放在同一個檔案中。
https://ithelp.ithome.com.tw/upload/images/20250923/20169414UjZgoNVqwH.png

這時候把游標放到類別上,按下 "⌘Cmd + R, O" Move,我選擇 Move to Folder
https://ithelp.ithome.com.tw/upload/images/20250923/20169414XWE4yQ86LE.png

輸入要放的路徑後,按下 Next。
https://ithelp.ithome.com.tw/upload/images/20250923/20169414ofyUaQSDmx.png

成功分裂到新的檔案中,可以看到 Rider 連 namespace 都幫我修正了。
https://ithelp.ithome.com.tw/upload/images/20250923/20169414EpgbUQ1SDa.png

回憶起小時候在拆類別的時候,還要自己新增類別、複製貼上、改引用等等一堆事情超級麻煩,做到手痠不說,還可能會出錯。感謝 Rider 解救了我的腱鞘炎,幫我把這些雜事都處理得漂漂亮亮,真是太好了!


上一篇
Day 8. Extract Variable:為那語句找到名字
下一篇
Day 10. Inline Method/Variable:收集破碎的邏輯
系列文
沒測試也敢重構?IDE 安全重構 30 日生存指南14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言