Mengenal Android MVP Pattern - Sebuah Konsep
Sesekali nulis rada serius isinya, tentang Android MVP Pattern yang saya sendiri baru benar-benar paham konsepnya minggu ini. Biasanya, kita membuat aplikasi android dengan pattern MVC, yang bukan Model View Controller itu, tapi Massively View Controller yang artinya semua logic code dan business code disimpan di View.
Sekilas tentang MVP
Apa itu? apa MVP?
MVP atau Model View Presenter adalah sebuah konsep dimana kita memisahkan logic code atau business code dari View ke Presenter, jadi tugas utama dari Presenter adalah sebagai penyedia data dari Model, selain sebagai penyedia data, Presenter juga bisa menyimpan logic yang biasa kita simpan di View dan menerima action yang dikirim dari View. Model itu sendiri adalah sekumpulan dari data structure
yang dikumpulkan menjadi satu class, tugasnya untuk menyimpan data dari API response atau menyimpan data untuk API request.
Jadi, gambarannya seperti ini
Model <-> Presenter <-> View
Secara garis besar, Presenter adalah penghubung antara Model dan View. Yang artinya, View tidak lagi berkomunikasi dengan Model karena Presenter yang akan menyajikan Model pada View
Mengapa MVP?
Ini pertanyaan saya dulu, kenapa harus MVP? Selain untuk gaya-gayaan atau keren-kerenan Fungsi utama dari MVP adalah sebagai berikut:
- Beban kerja dari View lebih ringan karena tidak mengurusi
http request
atauhttp response
. - Membagi tugas ke setiap layer sehingga
code
menjadi TESTABLE. - Membagi kode-kode yang bejibun menjadi bagian-bagian kecil dan sesederhana mungkin.
- Mempermudah
code maintenance
.
Kapan harus menggunakan MVP?
Kapan-kapan bisa, tapi ketika fitur dan kode di aplikasi kita semakin bertambah, inilah saatnya untuk beralih. Biar kualitas dari aplikasi juga lebih meningkat, begitu.
Contoh Kasus
Contohnya, saya punya aplikasi sederhana, yaitu aplikasi penghitung luas dari nilai panjang
* lebar
yang hanya akan memiliki 1 buah layout dan 1 buah kelas Activity
, oke?
Kira-kira seperti ini kode yang biasa ditemui.
Refactor
Yang akan dilakukan selanjutnya adalah, memecah beberapa baris kode di MainActivity.java dan mengekstraknya menjadi method
atau function
. Istilahnya, kita akan melakukan refactor atau merubah kode menjadi lebih baik.
Sampai saat ini, aplikasi berjalan dengan baik.
Selanjutnya, kita akan membuat tiga buah file baru bernama MainPresenter
, MainView
dan MainModel
, dimana MainActivity
akan mengimplementasikan MainView
dan juga mendeklarasikan MainPresenter
di dalamnya, dan MainModel
akan berisi variabel dari luas
. Fungsi dari MainView
sendiri adalah agar MainPresenter
bisa berinteraksi dengan code yang ada di MainActivity
.
Hal yang akan dilakukan adalah:
- Membuat class baru bernama
MainPresenter
,MainModel
dan interface baru bernamaMainView
; - Implementasikan
MainView
diMainActivity
; - Deklarasikan
MainPresenter
diMainActivity
dengan parameterMainView
; - Pindahkan fungsi
hitungLuas(int panjang, int lebar)
keMainPresenter
; - Buat fungsi baru
void tampilkanLuas(int luas)
diMainView
; - Tambahkan anotasi
@Override
di atastampilkanLuas(int luas)
diMainActivity
; - Panggil
hitungLuas(panjang, lebar)
dariMainPresenter
diMainActivity
; - Panggil
tampilkanLuas(luas)
dariMainActivity
melaluiMainView
diMainPresenter
;
Pada contoh kasus ini, View akan memiliki behavior yang disebut Tell, don't Ask
ke Presenter yang artinya View tidak akan menerima returned value dari Presenter, tetapi Presenter lah yang akan memberikan perintah untuk mengeksekusi fungsi yang ada di View beserta data yang dibutuhkan. Oleh karena itu, fungsi dalam MainActivity
haruslah mengimplementasikan fungsi dari MainView
.
Dan di akhir, code saat ini adalah:
Unit Test
Salah satu kelebihan dari MVP adalah setiap logic code atau business code bisa diuji dengan Unit Test
, pada kasus ini saya akan menggunakan Junit4
sebagai library untuk melakukan pengetesan Unit Test
.
Tambahkan terlebih dahulu testCompile group: 'org.mockito', name: 'mockito-core', version: '2.2.3'
ke file build.gradle
di dalam tag dependencies
untuk menggunakan Mockito sebagai library pembantu. Mockito memiliki fungsi yang bisa digunakan untuk mereplikasi sebuah kelas dan bisa kita gunakan untuk pengujian pada level Unit Test
. Setelah menambahkan baris tadi, refresh gradle dengan klik teks Sync Now
pada bar yang muncul lalu klik menu Build -> Rebuild Project.
Buatlah sebuah file dengan nama MainPresenterTest
di folder test/java/
, atau Klik Kanan -> Go To -> Test -> Create New Test…, gunakan Junit4
sebagai TestLibrary lalu pilih direktori test
, bukan androidTest
.
Berikut adalah file Unit Test
yang saya buat dengan nama MainPresenterTest
.
Sekarang, inilah struktur project kita saat ini
Dan ini hasil dari pengujian Unit Test
pada logic code di MainPresenter
.
Dan ini aplikasi dengan tampilan dan hasil yang sama dengan sebelumnya
Tautan Project di github
Sekian, selamat mencoba.
Comments