
Apa yang akan Anda temukan di artikel ini?
Pada 2016, saya mulai belajar Java, dan pada awal 2017, Android. Sejak awal, saya sudah tahu bahwa ada konsep arsitektur aplikasi, tetapi saya tidak tahu bagaimana menerapkan ini dalam kode saya. Saya menemukan banyak panduan berbeda, tetapi tidak jelas dari ini.
Artikel ini persis yang ingin saya baca di awal perjalanan saya.
Pentingnya Arsitektur Aplikasi
Banyak perusahaan melakukan tes teknis untuk kandidat yang dipilih. Tes mungkin berbeda, tetapi ada satu hal yang menyatukan mereka. Semuanya membutuhkan pemahaman dan kemampuan untuk menggunakan arsitektur perangkat lunak yang baik.
Arsitektur perangkat lunak yang baik memudahkan untuk memahami, mengembangkan, memelihara, dan mengimplementasikan sistem [Buku "Arsitektur Bersih", bab 15]
Tujuan artikel ini adalah untuk mengajarkan seseorang yang belum pernah menggunakan arsitektur untuk mengembangkan aplikasi Android untuk melakukan ini. Untuk melakukan ini, kami akan mempertimbangkan contoh praktis aplikasi, selama pembuatannya kami menerapkan solusi yang paling tidak fleksibel dan solusi yang lebih optimal menggunakan arsitektur.
Contoh
Elemen dalam RecyclerView:

- Kami akan menerima data dari API dan menunjukkan hasilnya kepada pengguna.
- Hasilnya akan menjadi daftar bir dengan nama, deskripsi, konten gambar dan alkohol untuk masing-masing.
- Bir harus dipesan berdasarkan tingkat benteng.
Untuk mengatasi masalah ini:
- Kami perlu mendapatkan data dari API.
- Mengurutkan item dari tingkat terendah ke tingkat tertinggi benteng.
- Jika kandungan alkohol kurang dari 5%, lingkaran hijau akan ditarik, jika itu antara 5% dan 8% - lingkaran akan berwarna oranye, dan di atas 8% - lingkaran merah.
- Akhirnya, kita perlu menunjukkan daftar barang.
Apa solusi yang paling tidak fleksibel?
Solusi yang paling tidak fleksibel adalah menciptakan satu kelas yang akan memenuhi empat poin sebelumnya. Ini adalah keputusan yang akan dibuat oleh siapa pun dari kita jika kita tidak tahu apa arsitektur aplikasi itu.
Hasil untuk pengguna akan dapat diterima: ia akan melihat daftar yang dipesan di layar. Tetapi jika kita perlu skala sistem ini, kita akan mengerti bahwa struktur tidak mudah untuk dipahami, dikembangkan lebih lanjut, dipelihara dan diimplementasikan.
Bagaimana memahami arsitektur aplikasi di Android?
Saya akan memberikan contoh yang sangat sederhana. Bayangkan sebuah pabrik mobil dengan lima zona:
- Zona pertama menciptakan sasis.
- Zona kedua menghubungkan bagian-bagian mekanik.
- Zona ketiga mengumpulkan sirkuit elektronik.
- Area keempat adalah cat.
- Dan area terakhir menambahkan detail estetika.
Ini berarti bahwa setiap zona memiliki tanggung jawab masing-masing, dan mereka bekerja dalam rantai dari zona pertama ke zona kelima untuk mencapai hasil.
Sistem seperti itu memiliki keunggulan yang pasti. Jika mobil memberikan kesalahan setelah selesai, maka tergantung pada perilakunya, kita akan tahu departemen mana yang harus memperbaikinya tanpa mengganggu orang lain.
Jika kita ingin menambahkan lebih banyak detail estetika, kita akan langsung beralih ke bagian kelima. Dan jika kita ingin mengubah warna, kita beralih ke yang keempat. Dan jika kita mengganti sasis, ini tidak akan mengubah cara area cat bekerja. Artinya, kita dapat memodifikasi alat berat secara langsung tanpa mengganggu seluruh pabrik.
Selain itu, jika seiring waktu kami ingin membuka pabrik kedua untuk membuat model mobil baru, akan lebih mudah untuk membagi area kerja.
Arsitektur Aplikasi Android
Kami akan memastikan bahwa tidak ada kelas yang akan melakukan semua pekerjaan sendiri: meminta data dari API, menyortir dan menampilkannya. Semua ini akan didistribusikan ke beberapa area yang disebut layer.
Apa lapisan-lapisan ini?

Untuk contoh ini, kita akan membuat arsitektur yang bersih, yang terdiri dari tiga tingkatan, yang pada gilirannya akan dibagi menjadi lima:
- Tingkat presentasi.
- Tingkat logika bisnis.
- Dan tingkat data.
1. Tingkat Presentasi
Level presentasi adalah level pengguna, antarmuka grafis yang menangkap peristiwa pengguna dan menunjukkan hasilnya. Itu juga memeriksa bahwa tidak ada kesalahan format dalam data yang dimasukkan oleh pengguna, dan bahwa data yang ditampilkan ditampilkan dengan benar.
Dalam contoh kami, operasi ini dibagi antara lapisan antarmuka pengguna dan tingkat ViewModel:
- Lapisan antarmuka pengguna berisi Kegiatan dan fragmen yang menangkap peristiwa pengguna dan menampilkan data.
- Lapisan ViewModel memformat data sehingga antarmuka pengguna menampilkannya dengan cara tertentu.
Alih-alih menggunakan ViewModel kita bisa menggunakan layer lain yang melakukan fungsi ini, cukup penting untuk memahami tanggung jawab setiap layer.
Dalam contoh kami, lapisan antarmuka pengguna menampilkan daftar bir, dan lapisan ViewModel melaporkan warna yang harus Anda gunakan tergantung pada kisaran alkohol.
2. Tingkat logika bisnis
Pada level ini semua persyaratan bisnis yang harus dipenuhi aplikasi. Untuk ini, operasi yang diperlukan dilakukan di sini. Dalam contoh kita, ini adalah penyortiran bir dari yang terendah ke yang paling kuat.
3. Lapisan Data
Pada level ini adalah data dan cara untuk mengaksesnya.
Operasi ini dibagi antara tingkat repositori dan tingkat sumber data:
- Lapisan repositori mengimplementasikan logika akses data. Tanggung jawabnya adalah mendapatkan data. Penting untuk memeriksa di mana mencarinya pada saat tertentu. Misalnya, Anda dapat memeriksa database lokal terlebih dahulu dan, jika tidak ada data di sana, buat permintaan ke API dan simpan data ke database. Artinya, ini menentukan cara untuk mengakses data. Dalam contoh kami, ia meminta data bir langsung dari tingkat yang berinteraksi dengan API.
- Lapisan sumber data bertanggung jawab langsung untuk menerima data. Dalam contoh kami, ini mengimplementasikan logika akses API untuk mendapatkan data bir.
Bagaimana cara lapisan berinteraksi?
Mari kita lihat pendekatan interaksi teoretis dan praktis.
Secara teori:

Setiap lapisan harus berkomunikasi hanya dengan tetangga terdekatnya. Dalam hal ini, jika kita melihat diagram arsitektur perangkat lunak:
- Antarmuka pengguna hanya dapat berkomunikasi dengan ViewModel.
- ViewModel hanya dapat berkomunikasi dengan tingkat logika bisnis.
- Tingkat logika bisnis hanya dapat berkomunikasi dengan tingkat repositori.
- Dan repositori hanya dapat berkomunikasi dengan sumber data.
Dalam praktek:
Struktur paket di Android Studio IDE dengan arsitektur bersih:

Kami memiliki struktur paket di mana kelas dibuat, yang masing-masing memiliki bidang tanggung jawab sendiri.
Penutup komentar pada arsitektur aplikasi
Kami melihat bahwa setiap tingkat arsitektur perangkat lunak memiliki bidang tanggung jawabnya sendiri dan semuanya saling berhubungan.
Penting untuk menekankan bahwa kita tidak pernah berbicara tentang perpustakaan atau bahasa pemrograman yang digunakan, karena arsitektur difokuskan pada penataan kode yang benar sehingga dapat diskalakan. Perpustakaan berubah seiring waktu, tetapi prinsip arsitektur tetap ada.
Lebih lanjut disarankan untuk membaca tentang injeksi ketergantungan untuk menghindari pembuatan instance objek langsung di kelas arsitektur dan, dengan demikian, untuk dapat melakukan pengujian unit menggunakan Mockito dan JUnit.
Saya berbagi repositori tempat Anda dapat melihat:
- Contoh arsitektur Android bersih dengan Kotlin.
- Gunakan LiveData untuk menghubungkan antarmuka pengguna dengan ViewModel.
- Penggunaan corutin.
- Kodein untuk injeksi ketergantungan.
- JUnit dan Mockito untuk menguji logika bisnis.