簡介
Dependency Injection (DI,依賴注入) 是一種設計模式 (Design Pattern),開發時使用合適的設計模式可以讓後續的維護和擴充更為方便。
DI 是 Android 程式開發者一定要了解的技術,幾乎在每個專案中都可以用到。
我在剛入門時對這個觀念很模糊,沒辦法真正理解其原理與目的為何,依照 James Shore 的說法,Dependency Injection 的簡單意思就是 “Giving an object its instance variables.”
也就是說,其實 Dependency Injection 只是讓程式知道,這些要注入的參數,要到那裏去找到,而且自動載入 。
活用這個概念,有以下優點:
1、程式運用更靈活 (Improve Reusable)
2、維護更方便 (Improve Maintainable)
3、測試程式更好寫 (Improve Testable)
說明
什麼是依賴 (ependency)?
以車輛為例
class Car {
var body = Body("Aluminum")
var tire = Tire(16)
var engine = Engine("V8")
} {
fun move() { }
}
val mycar = Car()
在 Car 類別中,我們用到了 Body (車身)、Tire (輪胎)、Engine (引擎) 這三個類別的實例;我們就可以說:Car 這個類別依賴 Body, Tire, Engine 這三個類別的實例。
但這種寫法其實是不好的,因為缺乏彈性,如果我們需要一個 V6 引擎的 Car instance,我們就得重寫一個類別。
比較好的寫法,是把這些依賴的實例,使用建構參數傳入,
class Car(
var body: Body,
var tire: Tire,
var engine: Engine
) {
fun move() { }
}
val myV8car = Car(
body = Body("Allumiun"),
tire = Tire(16),
engine = Engine("V8")
)
val myV6car = Car(
body = Body("Allumiun"),
tire = Tire(16),
engine = Engine("V6")
)
這樣一來,我們可以隨時更換其依賴的元件,提升程式的再用性。
這其實就是一種最常用的注入方式:建構元注入
依賴注入的原則
依賴介面,而非實作
問題
1、Dependency Injection 一定要使用 Dagger-Hilt 或是 Koin 這一類的函式庫嗎?
不是,這一類的函式庫只是幫助我們更容易的使用而已,我們其實可以自行完成 Dependency Injection 的功。
參考資料
Dependency Injection Demystified -James Shore
淺入淺出 Dependency Injection – Wenchin Roll Around
Comments