iT邦幫忙

2025 iThome 鐵人賽

DAY 13
0
Software Development

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

Day 13. Change Signature 之 3:老闆幫我把這邊的參數打包一下

  • 分享至 

  • xImage
  •  

昨天講完參數的垂直移動,有時候我們還會想要將參數整理成 Value Object 或是 Parameter Object,讓方法/函式的簽章簡潔一點,來看看我們有哪些招數可以用吧!

這是程式原本的樣子。我想要將 IsBetween 當中的時間參數打包進 DateRange。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414i1QuqAdorn.png

1. 由外而內

這裡只是簡單的把原本裸露的原始型別 primitive 替換成物件。這步驟只能手動做,Rider 沒辦法幫我,其實不是很安全,需要小心再小心。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414hNrEvtVH6w.png

接著用昨天學會的 Inline Parameter
https://ithelp.ithome.com.tw/upload/images/20250927/20169414PoAu3kJpnv.png

把兩個時間參數勾起來,Rider 還提醒我會有新的參數 dateRange 被加進去。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414NChREMgFhh.png

成功!
https://ithelp.ithome.com.tw/upload/images/20250927/20169414iYcJAe54ZR.png

2. 由外而內 - 2

前幾天都有提到,Rider 在處理方法簽章的時候,如果涉及多個操作,很容易有 bug。前面做的 Inline Parameter 其實包含了兩步驟:添加新參數、inline 舊參數。

假設我的起手式稍微不同,例如這邊把 dateRange 物件放到 lambda 中來建立。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414XdjlMDtARZ.png

一樣在 Inline Parameter 選取兩個時間參數。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414RpL9nOVqIc.png

Boom!壞掉了。Rider 並沒有幫我把 dateRange 加到參數中。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414ymwEFMGlQg.png

這時候可以參考傳統的重構步驟。先退回上一步,然後在方法的呼叫中把 dateRange 加進去,這時候編譯會是壞的,不過別擔心,我們馬上會修好。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414OIheAX1gmM.png

使用熟悉的 Show Context Actions,聰明的 Rider 馬上就說可以幫我把新參數加進去,直接按下去!
https://ithelp.ithome.com.tw/upload/images/20250927/20169414uRab6FnHq8.png

這時候編譯已經修好了,不過新加的參數還沒有被引用。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414z8t6K7iNel.png

這時再執行一次 Inline Parameter
https://ithelp.ithome.com.tw/upload/images/20250927/201694143NoAYuMV3u.png

這次就順順利利的成功啦~
https://ithelp.ithome.com.tw/upload/images/20250927/20169414tI8j664qxl.png

3. 由內而外

這次我選擇在 IsBetween 中建立 dateRange 物件。這步驟一樣是手動,一樣要非常小心。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414kev91iNFJ9.png

接著選擇 Introduct Parameter
https://ithelp.ithome.com.tw/upload/images/20250927/20169414jzdSbBLs0q.png

成功!
https://ithelp.ithome.com.tw/upload/images/20250927/20169414qxINSEAqgF.png

4. Transform Parameter

前面的操作都是建立在 DateRange 型別已經存在的前提下,若是還不存在,我們可以用 Transform Parameters
https://ithelp.ithome.com.tw/upload/images/20250927/201694145OIKWUT2GA.png

選取要抽成物件的參數,按下 Next。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414palwOAa3qQ.png

完成。
https://ithelp.ithome.com.tw/upload/images/20250927/20169414T4n0pSpoBn.png

小結

今天開始有點用 combo 技來重構的感覺了。如同 Kent Beck 的 《TDD By Example》中提到的,開發時會有不同不同的路徑,某些路徑能用較小而確實的步伐來走,某些路徑則相反。日常的重構也是這樣。

而今天也可以看到一些 IDE 的極限,有些事情 IDE 做不到,只能靠人工來做,有些時候 IDE 也會有 bug。這時候如果有個測試,還是最好的!


上一篇
Day 12. Change Signature 之 2:讓參數垂直移動
下一篇
Day 14. if 的世界線:如果我能讓它變簡單......
系列文
沒測試也敢重構?IDE 安全重構 30 日生存指南14
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言