SlideShare uma empresa Scribd logo
1 de 48
Baixar para ler offline
Why use
Dependency
Injection
Why not?
About me
● Colorgy Android Developer
● Love Clean code, Clean Architecture
● BBoy, swing dancer
先問大家一個問題
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
Outline
● 為何程式難以維護?
● Dependency Injection 的兩種模式
● DI 優點 && 該注意到的事
都是 They 的錯
● PM一直趕
● 需求改來改去
● 同事寫太爛
● 等這次功能做完就要開始重構了(立flag?)
於是...
成就了我們的神 - MainActivity
祂無所不知,無所不曉
成就了我們的神 - MainActivity
祂無所不知,無所不曉
FacebookSdk
AsyncTask
GoogleApiClientSomeDAO
SomeAdapter
SomeViewHolder
SomeFragment
URLConnection
耦合度太高
● 牽一髮而動全身
● 最熟悉的陌生人
● 不定時炸彈
讓 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 優點 && 該注意到的事
○ 低耦合、高內聚
○ 更清晰的意圖
○ 可維護性提高
○ 可測試性
說個好故事
不要以為大家都有“常識”
用 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 的原因?

Mais conteúdo relacionado

Semelhante a Why use dependency injection

Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-develop
fangdeng
 
The Clean Coder - 預估與壓力 (書摘)
The Clean Coder - 預估與壓力 (書摘)The Clean Coder - 預估與壓力 (書摘)
The Clean Coder - 預估與壓力 (書摘)
家弘 周
 
Debugging - 前端工程開發實務訓練
 Debugging - 前端工程開發實務訓練 Debugging - 前端工程開發實務訓練
Debugging - 前端工程開發實務訓練
Joseph Chiang
 
Background processing after android O ft. WorkManager
Background processing after android O ft. WorkManagerBackground processing after android O ft. WorkManager
Background processing after android O ft. WorkManager
Carter Chen
 

Semelhante a Why use dependency injection (20)

130113 why.&.how.smb.running.ux-light
130113 why.&.how.smb.running.ux-light130113 why.&.how.smb.running.ux-light
130113 why.&.how.smb.running.ux-light
 
Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!Java script 全面逆襲!使用 node.js 打造桌面環境!
Java script 全面逆襲!使用 node.js 打造桌面環境!
 
Reading guide of Domain-Driven Design the first 15 years
Reading guide of Domain-Driven Design the first 15 yearsReading guide of Domain-Driven Design the first 15 years
Reading guide of Domain-Driven Design the first 15 years
 
Cppunit下載、編譯、使用與困難排除
Cppunit下載、編譯、使用與困難排除Cppunit下載、編譯、使用與困難排除
Cppunit下載、編譯、使用與困難排除
 
簡單上手Android studio
簡單上手Android studio簡單上手Android studio
簡單上手Android studio
 
Test corner #20 誰說只有測試金字塔
Test corner #20 誰說只有測試金字塔Test corner #20 誰說只有測試金字塔
Test corner #20 誰說只有測試金字塔
 
前端測試
前端測試前端測試
前端測試
 
前端測試
前端測試前端測試
前端測試
 
減少重複的測試程式碼的一些方法
減少重複的測試程式碼的一些方法減少重複的測試程式碼的一些方法
減少重複的測試程式碼的一些方法
 
How to debug using GDB
How to debug using GDBHow to debug using GDB
How to debug using GDB
 
陽明交大 - 跟著 AI 學習 Angular
陽明交大 - 跟著 AI 學習 Angular陽明交大 - 跟著 AI 學習 Angular
陽明交大 - 跟著 AI 學習 Angular
 
测试驱动的前端开发初探
测试驱动的前端开发初探测试驱动的前端开发初探
测试驱动的前端开发初探
 
Test driven-frontend-develop
Test driven-frontend-developTest driven-frontend-develop
Test driven-frontend-develop
 
那些設計時容易忽略的事情 @Front-End Developers Taiwan Party 2
那些設計時容易忽略的事情 @Front-End Developers Taiwan Party 2那些設計時容易忽略的事情 @Front-End Developers Taiwan Party 2
那些設計時容易忽略的事情 @Front-End Developers Taiwan Party 2
 
The Clean Coder - 預估與壓力 (書摘)
The Clean Coder - 預估與壓力 (書摘)The Clean Coder - 預估與壓力 (書摘)
The Clean Coder - 預估與壓力 (書摘)
 
重构代码修炼之道
重构代码修炼之道重构代码修炼之道
重构代码修炼之道
 
AtticTV and NodeJS
AtticTV and NodeJSAtticTV and NodeJS
AtticTV and NodeJS
 
軟體品質與持續整合
軟體品質與持續整合軟體品質與持續整合
軟體品質與持續整合
 
Debugging - 前端工程開發實務訓練
 Debugging - 前端工程開發實務訓練 Debugging - 前端工程開發實務訓練
Debugging - 前端工程開發實務訓練
 
Background processing after android O ft. WorkManager
Background processing after android O ft. WorkManagerBackground processing after android O ft. WorkManager
Background processing after android O ft. WorkManager
 

Mais de 彥彬 洪 (13)

Rx java testing patterns
Rx java testing patternsRx java testing patterns
Rx java testing patterns
 
Rxjava2 custom operator
Rxjava2 custom operatorRxjava2 custom operator
Rxjava2 custom operator
 
Koin
KoinKoin
Koin
 
Android material theming
Android material themingAndroid material theming
Android material theming
 
Kotlin in practice
Kotlin in practiceKotlin in practice
Kotlin in practice
 
Jsr310
Jsr310Jsr310
Jsr310
 
ThreeTen
ThreeTenThreeTen
ThreeTen
 
科特林λ學
科特林λ學科特林λ學
科特林λ學
 
Mvp in practice
Mvp in practiceMvp in practice
Mvp in practice
 
Green dao 3.0
Green dao 3.0Green dao 3.0
Green dao 3.0
 
Android 6.0 permission change
Android 6.0 permission changeAndroid 6.0 permission change
Android 6.0 permission change
 
設定android 測試環境
設定android 測試環境設定android 測試環境
設定android 測試環境
 
Green dao
Green daoGreen dao
Green dao
 

Why use dependency injection