Mungkin bukan ide terbaik untuk melihat Rails sebagai pokok pola desain MVC. Kerangka kerja tersebut dibuat dengan beberapa kekurangan yang melekat (saya uraikan di pos yang berbeda ) dan komunitas baru saja mulai menangani dampaknya. Anda dapat melihat pengembangan DataMapper2 sebagai langkah besar pertama.
Beberapa teori
Orang-orang yang memberikan nasehat itu tampaknya mengalami kesalahpahaman yang cukup umum. Jadi izinkan saya memulai dengan menyelesaikannya: Model, dalam pola desain MVC modern, BUKAN kelas atau objek. Model adalah lapisan.
Ide inti di balik pola MVC adalah Separation of Concerns dan langkah pertama di dalamnya adalah pembagian antara lapisan presentasi dan lapisan model. Sama seperti lapisan presentasi yang dipecah menjadi pengontrol (contoh, bertanggung jawab untuk menangani masukan pengguna), tampilan (contoh, bertanggung jawab atas logika UI) dan templat / tata letak, begitu juga dengan lapisan model.
Bagian utama yang terdiri dari lapisan model adalah:
Objek Domain
Juga dikenal sebagai entitas domain, objek bisnis, atau objek model (Saya tidak suka nama terakhir itu karena hanya menambah kebingungan). Struktur ini adalah yang biasanya orang salah sebut sebagai "model". Mereka bertanggung jawab untuk memuat aturan bisnis (semua matematika dan validasi untuk unit logika domain tertentu).
Abstraksi Penyimpanan:
Biasanya diimplementasikan menggunakan pola data mapper (jangan bingung dengan ORM yang telah menyalahgunakan nama ini). Contoh ini biasanya ditugaskan dengan penyimpanan informasi-dari dan pengambilan-ke dalam objek domain. Setiap objek domain dapat memiliki beberapa pembuat peta, seperti halnya ada beberapa bentuk penyimpanan (DB, cache, sesi, cookie, / dev / null).
Jasa:
Struktur yang bertanggung jawab atas logika aplikasi (yaitu, interaksi antara objek domain dan interaksi antara objek domain dan abstraksi penyimpanan). Mereka harus bertindak seperti "antarmuka" di mana lapisan presentasi berinteraksi dengan lapisan model. Ini biasanya yang ada di kode mirip Rails berakhir di pengontrol.
Ada juga beberapa struktur yang mungkin berada di ruang antara grup ini: DAO , unit kerja dan repositori .
Oh ... dan ketika kita berbicara (dalam konteks web) tentang pengguna yang berinteraksi dengan aplikasi MVC, itu bukan manusia. "Pengguna" sebenarnya adalah browser web Anda.
Jadi bagaimana dengan dewa?
Alih-alih menggunakan beberapa model menakutkan dan monolitik, pengontrol harus berinteraksi dengan layanan. Anda meneruskan data dari input pengguna ke layanan tertentu (misalnya MailService
atau RecognitionService
). Dengan cara ini, pengontrol mengubah status lapisan model, tetapi dilakukan dengan menggunakan API yang jelas dan tanpa mengacaukan struktur internal (yang akan menyebabkan abstraksi bocor).
Perubahan tersebut dapat menyebabkan beberapa reaksi langsung, atau hanya memengaruhi data yang diminta oleh instance tampilan dari lapisan model, atau keduanya.
Setiap layanan dapat berinteraksi dengan nomor apa pun (meskipun, biasanya hanya segelintir) objek domain dan abstraksi penyimpanan. Misalnya, RecogitionService
tidak peduli tentang penyimpanan abstraksi untuk artikel.
Catatan penutup
Dengan cara ini Anda mendapatkan aplikasi yang dapat diuji unit di tingkat mana pun, memiliki kopling rendah (jika diterapkan dengan benar) dan memiliki arsitektur yang dapat dimengerti dengan jelas.
Padahal, perlu diingat: MVC tidak dimaksudkan untuk aplikasi kecil. Jika Anda menulis halaman buku tamu menggunakan pola MVC, Anda salah melakukannya. Pola ini dimaksudkan untuk menegakkan hukum dan ketertiban pada aplikasi skala besar.
Bagi orang yang menggunakan PHP sebagai bahasa utama, postingan ini mungkin relevan. Ini adalah deskripsi lapisan model yang sedikit lebih panjang dengan beberapa cuplikan kode.