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.
Jika kelas "model" diterapkan dengan buruk ya, perhatian Anda relevan. Kelas model tidak boleh melakukan Email (tugas infrastruktur).
Pertanyaan sebenarnya adalah apa yang disiratkan oleh model dalam MVC. Itu tidak terbatas pada kelas POCO dengan beberapa metode. Model dalam MVC berarti Data dan logika Bisnis. Perlakukan itu sebagai superset dari model POCO inti klasik.
Tampilan ==== Pengendali ==== Model ---> Lapisan Proses Bisnis -> Model inti
Lemparkan perakitan Infrastruktur dan lapisan Akses Data dan gunakan injeksi untuk memasukkannya ke dalam BPL, maka proses Anda menggunakan MVC sebagaimana dimaksud.
BPL dapat memanggil pola UoW / Respository, dan menjalankan aturan bisnis dan memanggil fitur Infrastruktur dengan cara memasukkan Object atau pola antarmuka.
Jadi rekomendasi untuk menjaga pengontrol tetap kurus tidak berarti kelas "orang" dalam model Core klasik harus memiliki 50 metode, dan memanggil Email secara langsung. Anda benar jika menganggap ini salah.
Kontroler Mungkin masih diperlukan untuk membuat instance dan memasukkan kelas Infrastruktur ke dalam BPL atau lapisan inti jika dipanggil secara langsung. Harus ada lapisan bisnis atau setidaknya kelas yang mengatur panggilan di seluruh kelas model Objek Klasik. Yah begitulah "pandangan" saya ;-)
Untuk penggunaan umum MVC deskripsi wiki http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller
Sebuah Blog Kecil yang berbicara tentang "M" di MVC. http://www.thedeveloperday.com/skinny-controllers/
sumber
Saya rasa Anda dapat membuat perbedaan antara model gemuk tunggal (mungkin bernama Aplikasi atau Aplikasi), dan beberapa model gemuk dipecah menjadi kelompok logis (Bisnis, Pelanggan, Pesanan, Pesan). Yang terakhir adalah bagaimana saya menyusun aplikasi saya, dan setiap model secara kasar sesuai dengan tabel database dalam database relasional atau kumpulan dalam database dokumen. Model ini menangani semua aspek pembuatan, pembaruan, dan manipulasi data yang membentuk model, baik itu berbicara dengan database atau memanggil API. Kontroler sangat tipis bertanggung jawab untuk lebih sedikit yang memanggil model yang sesuai dan memilih template.
sumber