此为历史版本和 IPFS 入口查阅区,回到作品页
kirato
IPFS 指纹 这是什么

作品指纹

《K的技術學習筆記》——提高彈性降低耦合:<Dependency Injection>

kirato
·
·
依賴注入 (Dependency injection)

依賴注入 (Dependency injection)是一種編程方式,有編程的人應該有用過這個方式。他的本意就是當前的class所需要的物件不是由class自身創建,而是由外部注入。

現在先舉一些例子來說明,以下例子是關於手機

用家(User)<沒有用依賴注入>

現代社會每一個人都持有手機,我們會用手機來付款(epay)和下載App(downApp)。現在這個用家他持有一個Android手機。現在這個例子並沒有用到依賴注入 (Dependency injection),這裡是直接在Constructor中創建一部Android 手機。

Android手機(AndroidPhone)

在Android手機中,當我們要下載App就要在Play Store找,要電子付款就用Google pay。這些操作過程就在Android手機裡實作。

除了Android手機外,智能手機還有iPhone。

iPhone(iPhone)

在iPhone中,當我們要下載App就要在App Store找,要電子付款就用Apple pay。這些操作過程就在iPhone裡實作。

現在用家不用Android手機要用iPhone了,當我們沒有用依賴注入 (Dependency injection)時,就要進入User class的constructor進行修改。因為AndroidPhone和User的耦合很高,所以當我們換走AndroidPhone時,User就會有很多地方要更動,例如constructor,epay和downApp。這次興幸的是iPhone有著和AndroidPhone相似的功能。因此,我們只需要改動constructor。

這時我們用到依賴注入 (Dependency injection)的話,就不用作出修改User class的行為。在大多數使用依賴注入 (Dependency injection)的同時會用到Interface,這樣我們就可以指定要注入有指定功能的物件。

智能電話(SmartPhone Interface)

這個Interface指定了智能電話要有下載App(downApp)和電子付款(epay)的功能。

用家(User)<使用依賴注入>

這裡用了依賴注入 (Dependency injection),用家的手機就由外界注入,而這裡我們指定要注入符合智能電話Interface的物件。

iPhone和Android手機(iPhone & AndroidPhone)

現在iPhone和Android手機都實作了智能電話Interface。

除了以上在constructor加上param是依賴注入,開設一個setter來注入都算是依賴注入(Dependency injection)。附上例子:

現在User class裡多了一個setter,他叫setPhone。這個方法也是依賴注入(Dependency injection)的應用。

總結

當使用了依賴注入 (Dependency injection)和Interface,class與class之間的關係也大大減少,也就是我說的低耦合。再者,因為低耦合,現在彈性高了,能輕易替換class裡所需的物件。用了Interface後,我們都知道他有什能功能能用,這樣我們就能在注入不同物件時不必修改class,這是因為注入的物件必定符合Interface。

CC BY-NC-ND 2.0 授权