Mvp in practice

37
MVP In Practice MVP, OOP and Unit test
  • Upload

    -
  • Category

    Software

  • view

    409
  • download

    1

Transcript of Mvp in practice

MVP In PracticeMVP, OOP and Unit test

About meAndroid developer 2 years+

Name: 洪彥彬

Gitbook: https://www.gitbook.com/book/hungyanbin/android-unit-test/

Github: https://github.com/hungyanbin

Forward

Survey1. 沒聽過MVP2. 有聽過MVP3. 有寫過MVP,但是沒在實際專案用過

4. 有在實際專案部分實行MVP5. 有在實際專案部分實行MVP,並撰寫單元測試

TA1. 沒聽過MVP2. 有聽過MVP3. 有寫過MVP,但是沒在實際專案用過

4. 有在實際專案部分實行MVP5. 有在實際專案部分實行MVP,並撰寫單元測試

Won’t mention...1. Concept of MVP2. Difference between MVP, MVVM and MVC

I hope you know...1. Unit Test2. MVP 3. Object-oriented programming

Step 1Define Contract

Contract1. 在實作前就先要定義好 → DIP2. 定義 View 跟 Presenter 職責

3. Contract 應該要看不到 Android framework 的元件(Bundle, Context)4. 有關 Android Framework UI 元件,都在 View 實作中解決

5. 有關 Android Framework 非 UI 元件,都在 Model 實作中解決

Sample : Login PageSpec :

1. 可以輸入帳號

2. 可以輸入密碼

3. 點擊登入按鈕後,如果帳密正確,顯示登入成功

4. 點擊登入按鈕後,如果帳密錯誤,顯示登入失敗

Step 2Implementation

Step 3Unit test

Too easy?

Let’s make it harderShow error message

Any Problem?

Possible Solution:

Before release...新需求:使用者登入失敗時告訴他輸入了什麼帳號

Bad smell1. 透露實作細節

2. 違反DIP(Dependency Inversion Principle)3. 依然沒有與 Android Framework(StringRes) 分開,而且使用integer來代表字串

不太合理4. 滿滿的技術債

讓我們重新思考一下

Create a proxycontext.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. 使用單元測試會知道自己設計的缺陷