Seorang developer Rails telah memicu diskusi komunitas dengan mengkritisi pola Hexagonal Architecture yang mendapat popularitas dalam aplikasi Rails sekitar satu dekade lalu. Penulis menciptakan istilah hexatetrahedral Rails untuk menggambarkan aplikasi yang menjadi terlalu kompleks melalui pendekatan arsitektur ini, mempertanyakan apakah manfaatnya sebanding dengan kompleksitas yang ditambahkan.
Kesenjangan Antara Janji dan Realita
Hexagonal Architecture asli, yang diusulkan oleh Dr. Alistair Cockburn , bertujuan untuk menciptakan pemisahan yang bersih antara logika bisnis dan kekhawatiran eksternal melalui antarmuka yang terdefinisi dengan baik. Namun, banyak implementasi Rails telah menyimpang jauh dari visi ini. Alih-alih mencapai modularitas yang diinginkan, aplikasi-aplikasi ini sering menjadi mimpi buruk pemeliharaan yang dipenuhi dengan abstraksi yang tidak perlu dan peralatan non-standar.
Komunitas telah mencatat bahwa meskipun repositori dapat mencegah developer junior membuat kesalahan database yang merugikan, membangunnya di atas ActiveRecord daripada menggantinya sepenuhnya lebih masuk akal secara praktis. Pendekatan ini mempertahankan konvensi Rails sambil menambahkan pagar pengaman yang diperlukan.
Karakteristik Umum Aplikasi Rails "Hexatetrahedral":
- DataMapper atau ROM sebagai pengganti ActiveRecord
- Penggunaan intensif pustaka dry-rb
- RSpec dengan mocking ekstensif sebagai pengganti Minitest
- FactoryBot sebagai pengganti fixtures
- Pola Repository yang membungkus akses ActiveRecord
- Trailblazer dan ROM untuk views
- Service objects untuk logika bisnis
Beban Pemeliharaan dan Dinamika Tim
Kekhawatiran signifikan yang diangkat adalah overhead pemeliharaan aplikasi hexatetrahedral. Codebase ini biasanya bergantung pada banyak pustaka pihak ketiga dan abstraksi kustom yang memerlukan pembaruan berkelanjutan dan pemahaman mendalam. Ketika anggota tim pergi atau pustaka menjadi usang, beban pengetahuan jatuh berat pada developer yang tersisa.
Diskusi mengungkapkan dilema umum yang dihadapi tim pengembangan: memilih antara pola Rails yang terdokumentasi dengan baik dan banyak digunakan versus mempertahankan keputusan arsitektur kustom yang dibuat bertahun-tahun sebelumnya. Sebagian besar developer, ketika terdesak waktu, akan meninggalkan pendekatan kustom demi metode Rails standar.
Masalah Penyempitan API
Penulis mengidentifikasi apa yang mereka yakini sebagai motivasi sebenarnya di balik arsitektur hexagonal Rails : mengurangi permukaan API ActiveRecord yang masif. Dengan lebih dari 666 metode kelas dan 230 metode instance yang tersedia pada ApplicationRecord dasar, mengontrol bagaimana tim berinteraksi dengan data menjadi menantang dalam organisasi besar.
Jika antarmuka saya adalah ActiveRecord mentah, maka Anda tidak bisa marah pada junior Anda karena membuat pemindaian tabel penuh dengan 'where' pada setiap permintaan.
Wawasan ini beresonansi dengan developer yang telah mengalami rasa sakit akses database yang tidak terbatas dalam aplikasi yang berkembang.
Kompleksitas API ActiveRecord:
- 666 class method tersedia pada ApplicationRecord
- 230 instance method per model
- Setiap asosiasi mengekspos jumlah method yang sama ditambah helper asosiasi
- Perilaku method yang rumit dengan batasan urutan dan dependensi
Alternatif yang Lebih Sederhana
Daripada mengimplementasikan arsitektur hexagonal penuh, penulis menyarankan pendekatan yang lebih pragmatis menggunakan modul Ruby untuk mengorganisir logika domain. Metode ini menyediakan pemisahan namespace dan batas yang lebih jelas tanpa overhead kompleksitas repositori, objek layanan, dan ORM kustom yang menjadi ciri aplikasi hexatetrahedral.
Komunitas Rails tampaknya sebagian besar telah melampaui mode arsitektur ini, dengan solusi yang lebih baru seperti Packwerk mengatasi kekhawatiran serupa tentang organisasi kode dan batas tim. Konsensus tampaknya mendukung disiplin dan konvensi yang jelas daripada kompleksitas arsitektur, terutama mengingat bahwa sebagian besar aplikasi tidak memerlukan manfaat teoretis yang dijanjikan arsitektur hexagonal untuk diberikan.
Catatan: Hexatetrahedral mengacu pada bentuk geometris yang kompleks, digunakan di sini secara metaforis untuk menggambarkan pola arsitektur yang terlalu rumit.
Referensi: Hexatetrahedral Rails