※ 引述《landlord (91)》之銘言:
: 最近在客戶那邊一起 pair 重構 legacy code,
: 碰到了一大段 if/else statement,用來判斷什麼時候該使用哪一種cache,
: 並依照不同 cache 的邏輯來決定回傳的內容。
: 發現還是有蠻多風氣比較封閉的公司對這類型的基本功跟處理不是很熟悉,
: 可能是對 code smell 不熟,對重構不熟,對 design pattern 不熟,對工具不熟。
: 因此,我用自己幾年前的一個「計算運費」的範例,設計成這類型程式碼重構的簡介。
: 這個範例之前是 C#,這次示範我改用 Java,用 IntelliJ 來重構。
: 有整個重構過程的 IDE 操作影片,也有每一個重構 baby steps 的 commit history。
: 影片:https://youtu.be/zO-NnNC-xyg
: GitHub commit history: https://bit.ly/strategy-91
: 也可以參考 《Refactoring to Patterns》 的
: Replace Conditional Logic with Strategy:
: https://www.informit.com/articles/article.aspx?p=1398607&seqNum=2
: IntelliJ/Android Studio 在重構上還是地表上最強的兵器啊。
上回用 Java + IntelliJ 來重構一堆 if/else 的計算運費範例,
這次改用 C# + Rider 來重構一樣的例子,方便習慣 C# 的朋友參考與練習,
不過這次刻意改用 Func<T> 來當作 strategy 的實作內容,
以 function 來取代,省去 class + interface 的部份。
兩種作法適用場景不同,東西夠小夠單純,想要少一點 class/interface 等 elements,
可以先這樣做,到真的有需要時,對熟悉重構的人來說,
要從 Func<T> 重構成 class + interface 只是一塊小蛋糕而已。
## Reference
1) C# + Rider Youtube 版影片:https://youtu.be/9rfVe6Uikt0
2) GitHub commit history: http://bit.ly/strategy-csharp
註:一般人的 Rider 沒有那個「把三元判斷式 自動替換成 Math.Min()」的燈泡,
那是我自己刻到 IDE 裡面的。