範例介紹
準備了一個「計算運費」的範例,由傳入的參數決定是要用「黑貓」、「新竹貨運」還是「郵局」來計算運費,而且三間物流商的運費計算邏輯各不相同。
這樣巢狀的 if/else block 在實務 legacy 產品上履見不鮮,雖然範例中的判斷式還不算太複雜,但這是因為示範需要,所以把其他 code smell 或不相干的複雜度都先簡化了,讓大家可以專注在如何把一整陀攤開的 legacy code,重構成具備 delegate 或 class/interface 職責內聚的設計,以期望達到未來新增別的物流商或是修改既有的運費計算方式,能滿足開放封閉原則(Open/Close Principle)。
註:這類需求,在電子商務、支付金流或其他需要跟外部不同 3rd-party 介接服務的交易系統,非常常見。
因應一些語言特性並不是這麼物件導向的(例如 Python, JavaScript),所以有一些示範我直接用 function 當單位,而不是用 interface/class 來當做內聚職責的個體。
也感謝好幾位好朋友一起共襄盛舉,補上了不少語言的版本,讓大家可以暖暖身、練練手,透過影片也可以看到 IDE 操作的一些技巧。
各語言版本庫
版本庫中都有 master 與其他重構示範的 branch,供大家可以從題目照著練習做做看。
Java
Python
C#
PHP (感謝 Recca Tsai 貢獻)
Go (感謝 Julian-Chu 貢獻)
Kotlin (感謝 黃健旻 Jian-Min-Huang 貢獻)
Swift (感謝 Tsungyu Yu 貢獻)
TypeScript (感謝 Steven Cheng 貢獻)
Ruby (感謝 Jim Chen 貢獻)
註:目前只有題目
Rust (感謝 chhuang 貢獻)
註:目前只有題目
其他語言版本,歡迎您一起參與
您可以在 91敏捷開發之路 傳訊息給我您的 repo 位置,我再確認之後會 fork 回來 tdd-best 的 org 底下。
如不方便用 Facebook,也可以直接 mail 給我:joeychen@odd-e.com