Clean Architecture in Android?
Yaps, sedikit cerita tentang bagaimana penerapan Clean Architecture di Android. Sample project menggunakan Kotlin.
What is Software Architecture?
Arsitektur Aplikasi dari setiap perusahaan atau setiap developers team pasti berbeda-beda, tapi dari setiap arsitektur memiliki tujuan yang sama, yaitu:
Arsitektur yang disepakati bersama ini memudahkan tim maupun developers lain (terutama yang baru masuk sebagai team member) bisa membaca codingan maupun structure project atau class yang telah dibuat sebelumnya. Karena telah dibuat kesepakatan tentang arsitektur apa yang dipakai, biasanya memudahkan Technical Writer untuk membuat documentation setiap project atau aplikasi yang dibuat.
Why we should concern about that?
Pertanyaan yang paling common dikalangan para developers, tapi masing-masing dari mereka memiliki pendapatnya sendiri-sendiri. Setiap developers memiliki arsitekturnya sendiri, bahkan mungkin ada yang agak selfish terhadap arsitekturnya, dan tidak mau menerima arsitektur lain.
Pertanyaannya, apa yang bisa menjamin code kita sudah readable, easy to modify and testable?
Berdasarkan pertanyaan diatas, munculah arsitektur-arsitektur diluar sana yang (harapannya) bisa membantu para developers dalam membuat aplikasi lebih rapih strukturnya, lebih mudah untuk ditest, dan mudah dimengerti oleh developers lain (terutama untuk new team member).
What is Clean Architecture?
Berdasarkan referensi diatas, Clean Architecture adalah salah satu solusi arsitektur yang ditawarkan oleh Uncle Bob.
Dalam bukunya Uncle Bob yang menjelaskan tentang Clean Code, Clean Architecture ini lebih menekankan ke penerapan SOLID Principle, terutama Single Responsibility Principle.
Layers for implementation Clean Architecture
Dalam penerapannya, mungkin bisa berbeda-beda setiap orang, Tapi untuk starting point, kita akan menggunakan 5 Layers seperti dibawah ini:
1. Domain
Disini berkaitan dengan model bisnis yang dimiliki oleh aplikasi kita. Dalam penerapannya, saya ambil contoh seperti Use Cases, Navigation Router. Sebagian besar aplikasi android yang dibuat adalah menggunakan API, sehingga kemungkinan aplikasi akan lebih banyak berinteraksi dengan cara Requesting dan Persisting. Maka dari itu Layers ini akan sangat berguna untuk mengelompokkan Use Cases yang telah dibuat.
2. Data
Layer ini berfungsi sebagai tempat dimana kalian bisa mendefinisikan tentang variasi Data Model yang akan digunakan dalam aplikasi. Dalam pembuatan aplikasi, sebaiknya kalian menyimpan data secara local.
Maksudnya adalah agar aplikasi tidak selalu mengambil data dari API maupun dari resources lain setiap aplikasi dijalankan. Jadi, Layer ini bisa difungsikan untuk menyimpan Attribute Data untuk Local Database maupun Response Data dari API.
3. Presentation
Presentation Layer gunanya untuk mengelompokkan class yang berfungsi sebagai / berinteraksi dengan UI. Mungkin dalam penerapannya, kalian memiliki cara pandang masing-masing.
Layer ini biasanya berisi Android UI (Activity, Fragment, Views), Presenter atau ViewModels tergantung Pattern apa yang kalian pakai.
4. Use Cases
Use cases ini biasanya di istilahkan dengan Interactor, yang berisi fungsi-fungsi untuk mengambil atau mengirim data ke API. Kenapa butuh Layer ini? karena bisa memudahkan kalian jika ingin membuat Mocking Request ke API untuk keperluan Unit Test. Kita ambil contoh seperti dibawah ini (Unit test menggunakan Library Mockk) :
@Test
fun shouldGetAllLeaguesFromApi() {
val leaguesData = LeaguesMockProvider.responseData()
every { usecase.getAllLeagues() } answers { leaguesData }
mPresenter.getAllLeagues()
verify(exactly = 1) { mView.showProgressBar() }
}
5. External
Kita biasa membuat Function-function atau Object yang konteksnya bisa jadi Reusable function atau Class. Contohnya seperti Helper Class, Util Class, Scheduler Class, Constant Object, dll. Fungsi-fungsi atau variable yang ada di Layer ini harus as simple as possible karena sifatnya harus se-reusable mungkin.
How to implement above layers into Application Project?
Well, semoga kalian mudah dalam memahami tulisan saya tentang penerapan Clean Architecture ini. Karena yang paling penting dalam arsitektur ini adalah bagaimana penerapannya dalam aplikasi kita dan memahaminya.
Sebagai latihan, kalian bisa melihat Sample Project dari github saya, Project dibuat menggunakan Kotlin:
Saya tidak akan menjelaskan terlalu detail tentang aplikasi tersebut, kalian bisa Clone atau Fork proyek tersebut dan bisa kalian pelajari sendiri. Berikut sekilas tampilannya:
Conclusion
Clean Architecture ini bisa dipakai di Pattern apapun yang kalian ingin gunakan (MVP, MVVM, MV*), karena arsitektur ini bertujuan supaya memudahkan kalian dalam pembuatan aplikasi supaya lebih Testable, more readability, and as clean as possible.
Usahakan setiap kalian ingin membuat Class baru, pikirkan terlebih dahulu Class yang ingin dibuat termasuk di Layer apa. Sehingga meminimalisir House Keeping atau Refactoring code yang bisa menguras waktu dan tenaga kalian dikemudian hari.
Happy Coding :)