前幾天我們經歷了 Extract Method/Function
、Extract Variable
,知道怎麼從肥大的方法中拆出邏輯,當這些獨立的邏輯一個個被分離出來後,程式碼會漸漸地浮現一些形狀,例如:加解密用的、訂單用的、驗證用的或存取用的等等,這時就是依照職責抽取類別的好時機。
來看看前幾天的例子。那時從一個 GetOrders 的 API 中分離出了一個解密專用的方法。有可能我們需要針對它做單元測試、或是未來另外一個 controller 也會用到,感覺解密的邏輯放在 controller 中實在很彆扭。
我把游標定位到 Decrypt 方法上,按下 Refactor This
看看有什麼可以做的。看來 Extract Class 正是我需要的,按下去!
接著來為即將拆出的類別取名字......怎麼有一些紅色的警告,感覺有點怕怕的。右下的警告說我的方法在拆出去後會不能存取,原因是這個方法在原本的類別是 private,Rider 不會自動幫我轉換存取權。
於是我把它設定成 public。
左上的警告也是類似的問題,新的類別拆出去後,便無法存取原類別的 private 欄位。這次我採取另一個策略,先暫停抽類別,把 _privateKey 先改成用參數注入的方式。這要使用還沒提到的 Introduce Parameter
一路按下去後,可以看到 _privateKey 已經變成用參數引用了,這樣新類別就不會依賴於原類別。
這次沒有警告了,按下 Next!
成功,我們拆出了一個 RsaHelper 類別來專門處理 Rsa 的加解密。稍微細心的人會注意到,因為先前勾的選項,新類別還放在同一個檔案中。
這時候把游標放到類別上,按下 "⌘Cmd
+ R
, O
" Move,我選擇 Move to Folder
。
輸入要放的路徑後,按下 Next。
成功分裂到新的檔案中,可以看到 Rider 連 namespace 都幫我修正了。
回憶起小時候在拆類別的時候,還要自己新增類別、複製貼上、改引用等等一堆事情超級麻煩,做到手痠不說,還可能會出錯。感謝 Rider 解救了我的腱鞘炎,幫我把這些雜事都處理得漂漂亮亮,真是太好了!