本日討論 Effective Kotlin - Item 19:Do not repeat knowledge
第 15 天讓我們進到本書的第二部份。程式碼設計 (Code Design),程式碼設計包涵了重用性與抽象化設計。所以我們就先從重重用性的 DRY (Don't Repeat Yourself) 開始吧
If you use copy-paste in your project, you are most likely doing something wrong
作者被教導到 "如果你在專案中用了 CP 大法,那很大的可能作是錯了。因為這表示專案中有著冗餘的程式碼。這就違背了 DRY (Don't Repeat Yourself) 原則。重複的知識會使得未來的修改變得困難,因為改變某一處可能需要在多處進行同樣的修改。
變化是程式開發中唯一不變的事物。無論是用戶需求、設計標準,或是技術平台,都會隨著時間而變化。為了應對這些變化,避免知識的重複尤為重要。
在 Kotlin 我們可以利用函數型別與昨天提到的高階函數來達到 DRY. 場景:想像你正在開發一個電商應用程式,需要對訂單執行不同的折扣策略。所以打折的型狀就會是一個 (Double) -> Double
不使用高階函數:
fun applyStudentDiscount(order: Order): Order {
return Order(order.amount * 0.9) // 10% off
}
fun applyFirstTimeDiscount(order: Order): Order {
return Order(order.amount * 0.8) // 20% off
}
使用高階函數:
fun applyDiscount(order: Order, discountStrategy: (Double) -> Double): Order {
return Order(discountStrategy(order.amount))
}
val studentDiscount = { amount: Double -> amount * 0.9 }
val firstTimeDiscount = { amount: Double -> amount * 0.8 }
val orderWithStudentDiscount = applyDiscount(order, studentDiscount)
val orderWithFirstTimeDiscount = applyDiscount(order, firstTimeDiscount)
在這個例子中,我們使用高階函數 applyDiscount 來統一所有的折扣策略,並將具體的策略(如學生折扣或首次購買折扣)作為函數參數傳入。這讓我們的程式更加靈活,能夠容易地增加新的折扣策略,同時確保核心的打折應用邏輯保持不變。
Peter Pan