Skip to main content

Mobile Project Architecture

Overview​

Dokumen ini memberikan penjelasan mengenai arsitektur aplikasi mobile yang diimplementasikan menggunakan Clean Architecture, dengan pendekatan Layer-First, dan prinsip Separation of Concerns. Arsitektur ini memastikan skalabilitas, kemudahan pengujian, dan kemudahan pemeliharaan aplikasi.

Key Principles​

Clean Architecture​

Clean Architecture adalah pendekatan arsitektur perangkat lunak yang memisahkan aplikasi menjadi beberapa layer untuk menjaga kebersihan struktur kode dan memastikan pemisahan tanggung jawab. Prinsip utamanya adalah:

  • Arah dependensi hanya mengalir ke dalam. Layer yang lebih dalam tidak memiliki ketergantungan pada layer luar.
  • Logika bisnis berada di Domain Layer, terpisah dari UI dan manajemen data.
  • Infrastruktur, seperti penyimpanan data atau API, diisolasi sehingga mudah diganti atau diperbarui.

Layer-First Approach​

Pendekatan ini menekankan pembuatan layer terlebih dahulu sebelum mengimplementasikan fitur-fitur aplikasi. Manfaat dari pendekatan ini antara lain:

  • Struktur yang jelas: Setiap layer memiliki peran dan tanggung jawab spesifik.
  • Interaksi yang terkontrol: Layer hanya berkomunikasi dengan layer yang berdekatan, mengurangi risiko ketergantungan berlebih.
  • Kemudahan pemeliharaan: Perubahan di satu layer tidak memengaruhi layer lainnya.

Separation of Concerns (SoC)​

Separation of Concerns adalah prinsip desain perangkat lunak yang memastikan setiap komponen hanya memiliki satu tanggung jawab spesifik. Implementasi SoC membantu dalam:

  • Pemeliharaan: Perubahan pada satu bagian aplikasi tidak memengaruhi bagian lainnya.
  • Pengujian: Setiap modul dapat diuji secara independen.
  • Skalabilitas: Mudah menambahkan fitur baru tanpa mengganggu arsitektur yang sudah ada.

Repository Structure​

arkademi-flutter/
|-- commons/ # Komponen bersama
|-- prakerja/ # Produk Prakerja
|-- reguler/ # Produk Reguler
  • prakerja atau reguler: Dua produk yang memiliki fungsi atau tujuan berbeda, namun dapat menggunakan kode atau komponen dari commons/.
  • commons: Folder yang berisi komponen, utilitas, atau layanan yang digunakan bersama, seperti widget UI, helper functions, atau resource umum.

Structure in commons​

lib/
|-- services/ # Layanan seperti API client atau service handler
|-- styles/ # Tema, warna, dan styling aplikasi
|-- extentions/ # Ekstensi tambahan untuk library atau widget
|-- constans/ # Konstanta yang digunakan bersama
|-- exeptions/ # Manajemen error dan pengecualian
|-- helpers/ # Fungsi bantu seperti validasi atau formatter
|-- utils/ # Logika tambahan dan utilitas umum
|-- widgets/ # Komponen UI yang reusable
  • services: Menyediakan layanan seperti klien API, manajer service, atau wrapper untuk koneksi data yang sering digunakan di seluruh aplikasi.
  • styles: Menyimpan konfigurasi tema, warna, font, atau elemen desain yang digunakan untuk menjaga konsistensi tampilan aplikasi.
  • extentions: Berisi fungsi ekstensi yang menambahkan atau meningkatkan fitur library default Flutter/Dart.
  • constans: Mendefinisikan nilai tetap seperti URL, kunci API, string penting, atau konfigurasi yang digunakan di seluruh aplikasi.
  • exeptions: Mengelola error atau pengecualian khusus, seperti error parsing data, error jaringan, atau error otentikasi.
  • helpers: Mengakomodasi fungsi-fungsi kecil yang membantu, seperti format tanggal, validasi input, atau kalkulasi kecil.
  • utils: Berisi utilitas tambahan yang mungkin berupa algoritma atau logika kecil yang dapat digunakan di berbagai tempat.
  • widgets: Komponen UI yang reusable dan dirancang untuk digunakan di berbagai modul atau halaman.

Structure in prakerja or reguler​

lib/
|-- presentation/ # Layer presentasi
| |-- widget/ # Komponen UI reusable
| |-- pages/ # Halaman-halaman aplikasi
| |-- controller/ # Controller untuk state management
|
|-- domain/ # Logika bisnis
| |-- entities/ # Model bisnis inti
| |-- repositories/ # Abstraksi repository
|
|-- data/ # Manajemen data
| |-- local/ # Sumber data lokal
| | |-- secure_preferences/ # Penyimpanan aman
| | |-- shared_preferences/ # Penyimpanan preferensi umum
| | |-- database/ # Penyimpanan data besar
| |
| |-- remote/ # Sumber data remote
| |-- api/ # Integrasi API
| |-- firebase/ # Integrasi Firebase

Presentation​

Layer Presentation bertanggung jawab untuk antarmuka pengguna (user interface) dan mengelola interaksi antara pengguna dan aplikasi. Layer ini mencakup:

  • Widgets: Berisi komponen UI yang dapat digunakan kembali di seluruh aplikasi.
  • Pages: Merepresentasikan layar atau view dalam aplikasi, mengorganisasi alur utama pengguna.
    • Pages Components: Termasuk subkomponen spesifik untuk setiap halaman, seperti header, footer, atau widget khusus halaman.
  • Controller: Mengelola state management dan input pengguna, bertindak sebagai penghubung antara UI dan layer domain.

Domain​

Layer Domain adalah inti dari aplikasi dan berfokus pada logika bisnis. Layer ini independen dari kerangka kerja (framework) atau pustaka eksternal. Layer ini mencakup:

  • Entities: Merepresentasikan objek bisnis inti dengan properti dan metode penting, seperti User, Product, atau Order.
  • Repositories: Mendefinisikan antarmuka untuk operasi data, bertindak sebagai layer abstraksi antara layer Domain dan Data.

Data​

Layer Data mengelola semua operasi data, termasuk penyimpanan dan pengambilan data. Layer ini menyediakan implementasi untuk repositories yang didefinisikan di layer Domain. Layer Data dibagi menjadi:

  • Local: Mengelola data yang disimpan secara lokal pada perangkat.
    • Secure Preferences: Menangani penyimpanan data sensitif menggunakan preferensi terenkripsi.
    • Shared Preferences: Menyimpan pasangan kunci-nilai sederhana untuk pengaturan aplikasi atau kebutuhan data kecil.
    • Database: Mengelola penyimpanan data terstruktur dan relasional menggunakan sistem basis data.
  • Remote: Mengelola data yang diambil atau dikirim melalui jaringan.
    • API: Menangani interaksi dengan layanan RESTful atau GraphQL eksternal.
    • Firebase: Mengintegrasikan layanan Firebase untuk basis data waktu nyata, autentikasi, dan penyimpanan awan (cloud storage).

Benefits of the Architecture​

  • Maintainability: Pemisahan logika yang jelas membuat aplikasi mudah dipelihara.
  • Testability: Logika bisnis dapat diuji secara independen dari UI dan infrastruktur.
  • Scalability: Fitur baru dapat ditambahkan tanpa merusak kode yang sudah ada.
  • Reusability: Komponen dan layer dapat digunakan kembali di proyek lain.

Kamu dapat membaca lebih lanjut mengenai aturan penggunaan, disini.