[心得]以策略模式重構switch case或if (影片)

看板Soft_Job (軟體人)作者 (91)時間3年前 (2020/12/13 21:27), 編輯推噓17(17035)
留言52則, 20人參與, 3年前最新討論串1/6 (看更多)
最近在客戶那邊一起 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 在重構上還是地表上最強的兵器啊。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.25.31.202 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1607866053.A.4BB.html

12/13 22:18, 3年前 , 1F
推91哥
12/13 22:18, 1F

12/13 23:01, 3年前 , 2F
實用推Y
12/13 23:01, 2F

12/13 23:06, 3年前 , 3F
91安安
12/13 23:06, 3F

12/13 23:25, 3年前 , 4F
推,legacy code看到if又case又if真的吐血
12/13 23:25, 4F

12/14 09:10, 3年前 , 5F
shipper輸入的部分還有改善的空間嗎?感覺用字串很容易
12/14 09:10, 5F

12/14 09:10, 3年前 , 6F
出包...
12/14 09:10, 6F

12/14 09:16, 3年前 , 7F
包成 enum 吧,然後在 convert 到 enum 時做 err handlin
12/14 09:16, 7F

12/14 09:16, 3年前 , 8F
g
12/14 09:16, 8F

12/14 11:49, 3年前 , 9F
樓上,我想問一下當如果enum沒該對應,怎麼處理比較好?
12/14 11:49, 9F

12/14 12:28, 3年前 , 10F
Throw exception.
12/14 12:28, 10F

12/14 12:47, 3年前 , 11F
噗 XDDD
12/14 12:47, 11F

12/14 13:59, 3年前 , 12F
推~
12/14 13:59, 12F

12/14 14:36, 3年前 , 13F
改用kotlin重構,你會看到新世界
12/14 14:36, 13F

12/14 15:17, 3年前 , 14F
這樣switch的default動作用exception有點不太妥吧?
12/14 15:17, 14F

12/14 15:22, 3年前 , 15F
我會這樣問是我曾經是在對應後,外面增加判斷是否null
12/14 15:22, 15F

12/14 15:23, 3年前 , 16F
想知道有沒有其他方式,處理對應不到的情況
12/14 15:23, 16F

12/14 15:36, 3年前 , 17F
重點應該是對應不到後的行為,如果這本身就是不合法的操
12/14 15:36, 17F

12/14 15:36, 3年前 , 18F
作,你在外面檢查到 null 之後,還是要丟 exception 啊
12/14 15:36, 18F

12/14 15:36, 3年前 , 19F
12/14 15:36, 19F

12/14 15:38, 3年前 , 20F
還是看當下商業邏輯,如果走不下去直接丟 ex 外面就不用
12/14 15:38, 20F

12/14 15:38, 3年前 , 21F
檢查 null 更乾淨
12/14 15:38, 21F

12/14 15:39, 3年前 , 22F
switch的defalut動作是合法的阿<=這邊在於討論改成enum情況
12/14 15:39, 22F

12/14 15:39, 3年前 , 23F
推~
12/14 15:39, 23F

12/14 15:42, 3年前 , 24F
你應該不會想要全部用到的地方都檢查 null,把責任丟給
12/14 15:42, 24F

12/14 15:42, 3年前 , 25F
convertor ,錯就丟 ex,如此一來其他地方直接用 enum 就
12/14 15:42, 25F

12/14 15:42, 3年前 , 26F
乾淨很多
12/14 15:42, 26F

12/14 15:43, 3年前 , 27F
我知道你的使用情況了,我的情況是要吐不同的ex才多判斷null
12/14 15:43, 27F

12/14 15:45, 3年前 , 28F
對 還是根據你的情節決定 default 幹什麼事,說不定你們
12/14 15:45, 28F

12/14 15:45, 3年前 , 29F
有default enum
12/14 15:45, 29F

12/14 15:54, 3年前 , 30F
怕null做個空物件
12/14 15:54, 30F

12/14 16:33, 3年前 , 31F
推~ 影片看不是很明白但git history很清楚
12/14 16:33, 31F

12/14 22:40, 3年前 , 32F
推 看history很明確 每個步驟
12/14 22:40, 32F

12/14 22:44, 3年前 , 33F

12/14 22:45, 3年前 , 34F
寫了一個用泛型的範例
12/14 22:45, 34F

12/14 23:45, 3年前 , 35F
謝謝樓上幾位的鼓勵,我培訓中的練習題都是這樣呈現的
12/14 23:45, 35F

12/15 08:28, 3年前 , 36F
吃太飽
12/15 08:28, 36F

12/15 10:02, 3年前 , 37F
enum class Shipper implement Product interface ove
12/15 10:02, 37F

12/15 10:02, 3年前 , 38F
rride caculateFee method.另外 Shipper constuctor
12/15 10:02, 38F

12/15 10:02, 3年前 , 39F
宣告 shipperName 屬性 強迫每個 enum 一定有 name
12/15 10:02, 39F

12/15 10:02, 3年前 , 40F
屬性 再把 Cart 的 hashmap 替換成 Shipper.shipping
12/15 10:02, 40F

12/15 10:02, 3年前 , 41F
Fee(input) static method 裡面用 values() 比對 name
12/15 10:02, 41F

12/15 10:02, 3年前 , 42F
找出對應的 enum 再呼叫 caculateFee 即可
12/15 10:02, 42F

12/15 10:09, 3年前 , 43F
這樣就沒有 if 也沒有 map 也沒有 Cart class
12/15 10:09, 43F

12/16 14:00, 3年前 , 44F
你這個應該不能叫做策略模式,因為沒有動態 injection
12/16 14:00, 44F

12/16 14:01, 3年前 , 45F
另外我滿好奇你覺得的 code smell 是指什麼
12/16 14:01, 45F

12/16 14:02, 3年前 , 46F
在我看來你的 refactor 只有把 if 取代成 map
12/16 14:02, 46F

12/16 14:03, 3年前 , 47F
除此以外結構上並沒有什麼太大的差異
12/16 14:03, 47F

12/16 21:11, 3年前 , 48F
data clump 變成 parameter object: Product
12/16 21:11, 48F

12/16 22:24, 3年前 , 49F
順帶一提,歡迎大家把自己的想法、重構、設計呈現出來
12/16 22:24, 49F

12/16 22:25, 3年前 , 50F
soure code 在 github 上,連 branch 都開好了
12/16 22:25, 50F

12/16 22:25, 3年前 , 51F
歡迎fork回去,自己錄一版重構的影片跟repo放上來討論
12/16 22:25, 51F

12/16 22:26, 3年前 , 52F
soure -> source
12/16 22:26, 52F
文章代碼(AID): #1VrXR5Ix (Soft_Job)
文章代碼(AID): #1VrXR5Ix (Soft_Job)