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.