iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0

Kotlin 有一個非常強大的型態推斷系統。在多數情況下,不需要明確地指定變數的型別,因為編譯器可以從給定的值或表達式中推斷出來,非常的貼心跟聰明

val num = 10
val name = "Marcin"
val ids = listOf(12, 112, 554, 997)

這個強大的功能不僅開發時間得到改善,當型別從上下文中清晰可見,且額外的指定變得多餘且混亂時,可讀性也會提高。然而,在型別不明確的情況下,不應過度使用。在某些情況下,沒有明確的型別,程式碼可能會變得模糊或容易誤解。

val data = getSomeData()

我們為了可讀性而設計我們的程式碼,我們不應該隱藏對讀者來說可能很重要的資訊。因為開發者可能要花時間跳入 function 原始碼來查看,這並不合理。此外,使用者可能在 GitHub 或其他不支持跳入的環境中閱讀此程式碼,例如 PR (假定大家都有認真看 PR XD)。即使可以,我們所有人的工作記憶都非常有限,如此浪費它不是一個好主意。型別是重要的資訊,如果它不清楚,應該指定它。

val data: UserData = getSomeData()

提高可讀性並不是指定型別的唯一理由。正如在前面幾天:安全性中所示,它也是為了安全,在項目3:儘快消除平台類型和項目4:不要暴露推斷的型別。型別可能是開發者和編譯器都很重要的資訊。無論何時,都不要猶豫指定型別。它的成本很低,但可以提供很大的幫助。

使用具體的集合型別

當使用集合初始化函數(例如 listOf、mapOf 等)而不提供具體元素時,應該明確指定集合的型別。

// 不太清楚的
val numbers: List<Int> = listOf()

// 與上面相比,這個是更清楚的
val numbers = listOf<Int>()

使用 lambda 表達式時的參數型別

當 lambda 表達式的參數型別不能被清楚地推斷時,最好明確指定它。

val stringList = listOf("A", "B", "C")

// 較不明確
stringList.forEach { item -> println(item.toLowerCase()) }

// 較明確
stringList.forEach { item: String -> println(item.toLowerCase()) }

雖然在這個例子中,型別推斷很明確(因為 stringList 是一個 String 的列表),但在更複雜的情境中,明確指定參數的型別可能會有所幫助。

模糊的函數返回值

如果函數的返回值不能直觀地從其實現中推斷出來,則應明確指定返回值的型別。

fun getValue(): Int {
    return someComplexLogic()
}

總的來說,當 Kotlin 中的變數、函數返回值或 lambda 參數的型別不清楚或難以推斷時,最好明確指定它。這有助於提高程式碼的可讀性和維護性。

每日一推 (G)I-DLE

Senorita

Yes


上一篇
D11: 程式可讀性 : 減少認知負荷 - DevX
下一篇
D13: Kotlin 的 Properties 其實只是披著欄位的函式
系列文
讓 Kotlin 程式碼更道地 - 談 Effective Kotlin 與相關的 Design Pattern30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言