MVP In Practice
MVP, OOP and Unit test
About me
Android developer 2 years+
Name: 洪彥彬
Gitbook:
https://www.gitbook.com/book/hungyanbin/android-un
it-test/
Github: https://github.com/hungyanbin
Forward
Survey
1. 沒聽過MVP
2. 有聽過MVP
3. 有寫過MVP,但是沒在實際專案用過
4. 有在實際專案部分實行MVP
5. 有在實際專案部分實行MVP,並撰寫單元測試
TA
1. 沒聽過MVP
2. 有聽過MVP
3. 有寫過MVP,但是沒在實際專案用過
4. 有在實際專案部分實行MVP
5. 有在實際專案部分實行MVP,並撰寫單元測試
Won’t mention...
1. Concept of MVP
2. Difference between MVP, MVVM and MVC
I hope you know...
1. Unit Test
2. MVP
3. Object-oriented programming
Step 1
Define Contract
Contract
1. 在實作前就先要定義好 → DIP
2. 定義 View 跟 Presenter 職責
3. Contract 應該要看不到 Android framework 的元件(Bundle, Context)
4. 有關 Android Framework UI 元件,都在 View 實作中解決
5. 有關 Android Framework 非 UI 元件,都在 Model 實作中解決
Sample : Login Page
Spec :
1. 可以輸入帳號
2. 可以輸入密碼
3. 點擊登入按鈕後,如果帳密正確,顯示登入成功
4. 點擊登入按鈕後,如果帳密錯誤,顯示登入失敗
Step 2
Implementation
Step 3
Unit test
Too easy?
Let’s make it
harder
Show error message
Any Problem?
Possible Solution:
Before release...
新需求:使用者登入失敗時告訴他輸入了什麼帳號
Bad smell
1. 透露實作細節
2. 違反DIP(Dependency Inversion Principle)
3. 依然沒有與 Android Framework(StringRes) 分開,而且使用integer來代表字串
不太合理
4. 滿滿的技術債
讓我們重新思考一下
Create a proxy
context.getString()
resourceService.getString()
Git diff
What’s the difference??
1. 將context 的職責分出來,職責更清楚了
2. 可讀性比較高
3. Presenter 與 Android Framework 完全沒關係了
ResourceServiceImp(1)
ApplicationImp(2)
Unit test(3)
Summary
可能會遇到的實務困難
1. Presenter 與 Model 的職責不好決定
2. Presenter : View 是一對一?多對一?多對多?
3. 與 Android Framework 切不乾淨
4. 不會寫單元測試
一點點小心得
1. 要不要“全部”用MVP自己決定
2. 使用單元測試會知道自己設計的缺陷

Mvp in practice