SlideShare a Scribd company logo
Why use
Dependency
Injection
Why not?
About me
● Colorgy Android Developer
● Love Clean code, Clean Architecture
● BBoy, swing dancer
先問大家一個問題
Why use dependency injection
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
都是 They 的錯
● PM一直趕
● 需求改來改去
● 同事寫太爛
● 等這次功能做完就要開始重構了(立flag?)
於是...
成就了我們的神 - MainActivity
祂無所不知,無所不曉
成就了我們的神 - MainActivity
祂無所不知,無所不曉
FacebookSdk
AsyncTask
GoogleApiClientSomeDAO
SomeAdapter
SomeViewHolder
SomeFragment
URLConnection
Why use dependency injection
耦合度太高
● 牽一髮而動全身
● 最熟悉的陌生人
● 不定時炸彈
讓 DI 來降低耦合度
吧!
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
Dependency
Import com.yanbin.UserRepo;
class Presenter{
private UserRepo repo;
}
Presenter UserRepo
Injection
By constructor
Import com.yanbin.UserRepo;
class Presenter {
private UserRepo repo;
public Presenter(UserRepo repo) {
this.repo = repo;
}
}
Injection
By setter
Import com.yanbin.UserRepo;
class Presenter {
private UserRepo repo;
public setRepo(UserRepo repo) {
this.repo = repo;
}
}
誰提供 Dependency? 程式進入點
That’s all!
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
○ 低耦合、高內聚
○ 更清晰的意圖
○ 可維護性提高
○ 可測試性
DI ⇒ 不要在裡面 new
但是 Dependency 太多的話...
So Ugly
高耦合
有很多互動關係的 Dependency ->
很難拆開
低內聚
很多沒關係的 Dependency ->
多個職責的類別
趕快重構!
你聞到 bad smell 了嗎?
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
○ 低耦合、高內聚
○ 更清晰的意圖
○ 可維護性提高
○ 可測試性
說個好故事
不要以為大家都有“常識”
Why use dependency injection
用 Setter 比較清楚
原來要用美金計算啊!
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
○ 低耦合、高內聚
○ 更清晰的意圖
○ 可維護性提高
○ 可測試性
開放封閉原則
開放封閉原則
Local ? Remote ?
Combined? up to you!!
開放封閉原則
修改LocalUserRepo的
實作也沒關係
開放封閉原則
Presenter 沒任何影響
控制反轉(Inverse of Control)
轉的我頭好暈啊
控制不轉
控制反轉
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
○ 低耦合、高內聚
○ 更清晰的意圖
○ 可維護性提高
■ 開放封閉原則
■ 控制反轉
○ 可測試性
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
○ 低耦合、高內聚
○ 更清晰的意圖
○ 可維護性提高
■ 開放封閉原則
■ 控制反轉
○ 可測試性
就一句話
為了寫出好測試,你得使用DI
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
● 不要用 Singleton
不要用 Singleton
● 唯一的實體也要用注入的!不要 xxx.getInstance()
● 是不是唯一的統一由工廠控制
● Spooky action at a distance
● 也不要用靜態工廠(static factory method)模式
No “new”, no Singleton 除了....
1. 可信任的類別 : ArrayList, HashSet, LocalDate, Observable(如果你信任他的
話)
2. POJO類別
聽不太懂嗎?
也許你可以先從實踐單元測試、 MVP 開始
為什麼要用 Dependency Injection? (for
Android Developer)
Any Question?
任何討厭 DI 的原因?

More Related Content

More from 彥彬 洪 (13)

PDF
Rx java testing patterns
彥彬 洪
 
PDF
Rxjava2 custom operator
彥彬 洪
 
PDF
Koin
彥彬 洪
 
PDF
Android material theming
彥彬 洪
 
PDF
Kotlin in practice
彥彬 洪
 
PDF
Jsr310
彥彬 洪
 
PDF
ThreeTen
彥彬 洪
 
PDF
科特林λ學
彥彬 洪
 
PDF
Mvp in practice
彥彬 洪
 
PDF
Green dao 3.0
彥彬 洪
 
PDF
Android 6.0 permission change
彥彬 洪
 
PDF
設定android 測試環境
彥彬 洪
 
PDF
Green dao
彥彬 洪
 
Rx java testing patterns
彥彬 洪
 
Rxjava2 custom operator
彥彬 洪
 
Android material theming
彥彬 洪
 
Kotlin in practice
彥彬 洪
 
Jsr310
彥彬 洪
 
ThreeTen
彥彬 洪
 
科特林λ學
彥彬 洪
 
Mvp in practice
彥彬 洪
 
Green dao 3.0
彥彬 洪
 
Android 6.0 permission change
彥彬 洪
 
設定android 測試環境
彥彬 洪
 
Green dao
彥彬 洪
 

Why use dependency injection