分類
code 4 fun

用多型取代重複的判斷式

巢狀的 if/else block 在實務 legacy 產品上履見不鮮,在很多時候其實可以用多型的設計來取代這些重複的判斷式。

範例介紹

準備了一個「計算運費」的範例,由傳入的參數決定是要用「黑貓」、「新竹貨運」還是「郵局」來計算運費,而且三間物流商的運費計算邏輯各不相同。

這樣巢狀的 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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *