在物件導向的基本原則 SOLID 中,S 代表著 Single Responsibility Principle (單一職責原則),也就是每一個類別都應該只有一個功能。
將每一個功能,分別拆成不同的小類別,在維護上、測試上、使用上就會變得相對容易。
定義一個類別
那麼,我們該如何定義一個類別呢?
Kotlin 與其他語言一樣,都是用 class 當作類別的關鍵字,如下例:定義一個名稱為 Student 的類別
class Student
一般來說,類別都會建立在與它同名的檔案中。
- 若類別裡面是空的,不需要在後面接上 大括弧 {}。
建立實例
如上例,我們可以直接用類別名稱加上小括弧 (),來建立實例。
val student = Student()
類別函數、屬性
基於 SRP,我們應該將相同目的、相同功能的函數以及屬性定義在同一類別中,如下:
class Student {
val age = 20
fun sayHello() = println("Hello")
}
將類別實例化之後,使用 . 可以取用類別內的屬性或函數。
val student = Student()
student.age
student.sayHello()
屬性的 getter 與 setter
定義完屬性之後,Kotlin 會產生 field、setter、getter。
- field:用來儲存屬性資料。
- getter:決定如何讀取屬性值。
- setter:決定如何設定屬性值,只有屬性定義為 var 才有 setter 方法。
class Student{
var name = "Andy" //field, setter, getter 皆被隱藏起來
}val student = Student()
val name = student.name //getter
student.name = "Alex" //setter
覆寫 setter/getter
class Student{
var name = "Andy"
get() = field.toUpperCase()
set(value) {
field = "Mr. $value"
}
}val student = Student()
val name = student.name //getter ANDY
student.name = "Alex" //setter Alex
可見性與封裝
上面的例子中,類別函數以及類別屬性都沒有可見性關鍵字,所以在類別實例化之後,所有為加上可見性關鍵字的都可以被呼叫 (看見)。
一般來說,每一個類別都需要確認哪些函數、變數是可以被外界取用,不需要被外界所取用的項目,則會把它給隱藏起來,這就是封裝 (Encapsulation) 的概念。
那麼,該如何將不想暴露給外界的函數、變數給隱藏起來呢?下表為 Kotlin 提供的可見性修飾符:
class Student{
var name = "Andy"
private val id = 1
}
小結
物件導向中,類別是最為重要的一部分,在本篇文章中,我們知道了如何建立一個類別,並且在類別裡面定義函數以及屬性。
基於單一職責原則,我們需要讓類別裡面的功能只負責一件事,並且根據需求將不必要暴露給外部的函數及屬性隱藏起來。
類別的概念雖然容易,但是需要用的好,就需要把單一職責原則銘記在心,如此,就不會建立一個太多功能的類別,最後就會變得難以測試、維護。
如果這篇文章有幫助到你,請👏鼓勵我。
謝謝🙇
參考
KotlinLang: Classes