iT邦幫忙

2023 iThome 鐵人賽

DAY 15
0

本日討論 Effective Kotlin - Item 19:Do not repeat knowledge

第 15 天讓我們進到本書的第二部份。程式碼設計 (Code Design),程式碼設計包涵了重用性與抽象化設計。所以我們就先從重重用性的 DRY (Don't Repeat Yourself) 開始吧

DRY (Don't Repeat Yourself)

https://ithelp.ithome.com.tw/upload/images/20230929/20135701EB8aG5hmd6.png

If you use copy-paste in your project, you are most likely doing something wrong

作者被教導到 "如果你在專案中用了 CP 大法,那很大的可能作是錯了。因為這表示專案中有著冗餘的程式碼。這就違背了 DRY (Don't Repeat Yourself) 原則。重複的知識會使得未來的修改變得困難,因為改變某一處可能需要在多處進行同樣的修改。

變化是程式開發中唯一不變的事物。無論是用戶需求、設計標準,或是技術平台,都會隨著時間而變化。為了應對這些變化,避免知識的重複尤為重要。

利用高階函數達到 DRY

在 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 來統一所有的折扣策略,並將具體的策略(如學生折扣或首次購買折扣)作為函數參數傳入。這讓我們的程式更加靈活,能夠容易地增加新的折扣策略,同時確保核心的打折應用邏輯保持不變。

每日一推 (G)I-DLE

Peter Pan

Yes


上一篇
D14: 可讀性 - 利用 Kotlin Scope Function 讓你可讀性與安全性的兼顧
下一篇
D16: 不要重造輪子,多認識好用的函式, 函式庫
系列文
讓 Kotlin 程式碼更道地 - 談 Effective Kotlin 與相關的 Design Pattern30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言