Ketika menggunakan framework yang bersifat unopinionated atau agnostic, di mana framework tidak menentukan cara tertentu untuk mengorganisir kode atau menerapkan logika, kita perlu menerapkan konsep dan prinsip terbaik untuk menjaga kode tetap terstruktur, scalable, dan maintainable. Berikut adalah beberapa konsep yang bisa diterapkan sesuai best practice:
1. Separation of Concerns (SoC)
Pisahkan kode berdasarkan tanggung jawabnya. Misalnya, pisahkan logika bisnis, logika presentasi, dan logika data. Ini membantu meminimalkan keterkaitan antar bagian kode.
Praktik:
- Gunakan lapisan-lapisan seperti:
- Controller/Handler untuk menerima input.
- Service untuk logika bisnis.
- Repository/Model untuk operasi data.
- Hindari mencampur logika dalam satu tempat.
2. Modular Design
Buat aplikasi menjadi modular dengan memisahkan fitur ke dalam modul terpisah. Setiap modul menangani fitur atau domain spesifik.
Praktik:
- Strukturkan folder berdasarkan fitur atau domain, bukan tipe file.
- Contoh struktur folder:
4. Domain-Driven Design (DDD)
Gunakan pendekatan berbasis domain untuk menangani masalah kompleks. DDD membantu menjaga logika bisnis tetap terpusat di domain model.
Praktik:
- Identifikasi bounded context (area fungsional tertentu).
- Gunakan entity, value object, dan aggregate untuk merepresentasikan domain.
Contoh:
5. Clean Architecture
Terapkan clean architecture untuk menjaga kode tetap modular dan terpisah dengan jelas antara lapisan-lapisan utama:
- Entities: Logika bisnis inti.
- Use Cases: Aturan aplikasi spesifik.
- Interface Adapters: Konversi data antara domain dan infrastruktur.
- Frameworks & Drivers: Teknologi eksternal.
Praktik:
- Jangan biarkan teknologi (misal, database atau framework web) mendikte arsitektur aplikasi.
- Gunakan antarmuka (interface) untuk mendefinisikan kontrak antara lapisan.
6. Test-Driven Development (TDD)
Tulis tes terlebih dahulu sebelum menulis implementasi untuk memastikan kode Anda selalu memenuhi kebutuhan.
Praktik:
- Gunakan unit test untuk logika kecil.
- Gunakan integration test untuk memastikan modul bekerja bersama dengan baik.
Contoh:
7. Coding Principles (SOLID)
Ikuti prinsip-prinsip SOLID untuk menulis kode yang mudah dipelihara:
- Single Responsibility: Setiap kelas/fungsi hanya menangani satu hal.
- Open/Closed: Kode mudah diekstensikan tanpa perlu dimodifikasi.
- Liskov Substitution: Objek turunan harus bisa menggantikan objek induk.
- Interface Segregation: Jangan memaksa objek untuk mengimplementasikan interface besar yang tidak diperlukan.
- Dependency Inversion: Bergantung pada abstraksi, bukan implementasi.
8. Error Handling yang Konsisten
Gunakan pendekatan standar untuk menangani error di seluruh aplikasi.
Praktik:
- Abstraksikan logika error ke middleware atau handler.
- Gunakan pola Either atau Result untuk menangani hasil sukses/gagal.