Kotlin簡潔的利器:local function

Thu, Nov 18, 2021 閱讀時間 1 分鐘

如果只是local變數就不值得一提了,但是在kotlin連函數都可以宣告在另一個函數的local範圍內,可以宣告local函數能帶來什麼好處呢?

如果是在java的方法中有重複的代碼,要遵循DRY(Don’t Repeat Yourself)原則抽出成可以重用的獨立方法,但是在java的方法必須依附在類別,這種事做的多了,會造成一個問題就是這些獨立出的小方法其實只在原本的方法會用到,其它類別裡的方法並不需要共用到它,這樣顯得放到class level有點多餘,又會讓充斥這些小方法的整個類別越來越難以閱讀和維護,kotlin的local function就可以讓你把這個函數重複的代碼寫在自己裡面,經過這樣整理的內部函數也讓整個函數的結構脈絡更加清晰,更容易讀懂這個函數的程式執行流程在做什麼

fun main() {
    val username = "Ryan"
    val password = ""

    // test() 錯誤,local function跟local variable一樣,必須先宣告才能使用
    // local function
    fun test() {
        LoginAction().login(username, password) // 區域函數能夠直接存取外部函數的區域變數
    }
    test()
}

class LoginAction {
    fun login(username: String, password: String) {
        // 重複的檢查代碼
//        if (username.isEmpty()) {
//            throw IllegalArgumentException("username must not be empty")
//        }
//        if (password.isEmpty()) {
//            throw IllegalArgumentException("password must not be empty")
//        }
        // local function
        fun validate(value: String, paramName: String) {
            if (value.isEmpty()) {
                throw IllegalArgumentException("$paramName must not be empty")
            }
        }
        // 將檢查輸入的代碼獨立成一個內部共用函數再去呼叫
        validate(username, "username")
        validate(password, "password")
    }
}