Model gemuk dan pengontrol kurus terdengar seperti membuat model Dewa [tutup]

91

Saya telah membaca banyak blog yang menganjurkan pendekatan model gemuk dan pengontrol kurus , khususnya. kamp Rails. Akibatnya, router pada dasarnya hanya mencari tahu metode apa yang harus dipanggil pada pengontrol apa dan semua metode pengontrol yang dilakukan adalah memanggil metode yang sesuai pada model dan kemudian memunculkan tampilan. Jadi saya memiliki dua masalah di sini yang tidak saya mengerti:

  1. Pengontrol dan router benar-benar tidak melakukan tugas yang jauh berbeda selain hanya memanggil metode pada model seperti Tuhan berdasarkan rute.
  2. Para model melakukan terlalu banyak hal. Mengirim email, membuat hubungan, menghapus dan memodifikasi model lain, mengantri tugas, dll. Pada dasarnya sekarang Anda memiliki objek seperti Tuhan yang seharusnya melakukan segala sesuatu yang mungkin atau mungkin tidak berkaitan dengan pemodelan dan menangani data.

Di mana Anda menarik garis? Bukankah ini hanya jatuh ke dalam pola Tuhan?

Pemburu Hutan
sumber

Jawaban:

137

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 MailServiceatau 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, RecogitionServicetidak 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.

tereško
sumber
Jawaban yang sangat berguna dan lengkap! Apakah Anda tahu buku yang menjelaskan lebih banyak tentang pola arsitektur MVC? Terutama pada bagian model di mana setiap orang secara keliru mengira "Model mewakili data, dan tidak melakukan apa pun." dan kedengarannya lebih seperti ide objek domain, bukan 'Model' -> tomdalling.com/blog/software-design/…
thermz
1
@thermz, afaik , memang tidak ada buku yang khusus membahas pola MVC. Saya biasanya hanya menyuruh orang untuk membaca PoEAA , dan kemudian pergi menggali. Mungkin daftar tautan ini bisa bermanfaat. Saya menemukan bahwa, ketika orang memiliki pemahaman yang kuat tentang prinsip dan konsep OOP, polanya menjadi cukup mudah untuk dipahami.
tereško
@ tereško jawaban yang indah. Apakah Hibernate mencapai ini? Saya tidak yakin dengan jawabannya di sini -> stackoverflow.com/questions/1308096/…
Ankan-Zerob
@ Ankan-Zerob seperti yang mungkin Anda perhatikan, saya bukan pengembang java, tetapi dari apa yang saya ketahui tentang Hibernate, ini menyediakan perangkat lengkap untuk lapisan persistensi. Ini akan memberi Anda bagian dari apa yang dijelaskan di sana, tetapi bukan lapisan model lengkap.
tereško
3
@ Johnny tidak sejauh yang saya tahu. Kebanyakan yang disebut "kerangka kerja mvc" php adalah variasi dari Rails. Dan, sebagai bagian dari kursus, kebanyakan dari mereka datang dengan beberapa solusi ORM berbasis catatan aktif (hal-hal tersebut terkenal rapuh terhadap perubahan DB). Anda dapat mengimplementasikan sesuatu seperti ini dengan SF2.x atau ZF2.x, tetapi inti dari kerangka kerja bukanlah untuk mengimplementasikan / menegakkan arsitektur tertentu tetapi untuk menyediakan alat. Juga, ketika datang ke MVC, itu diimplementasikan oleh kode aplikasi dan bukan kerangka kerja.
tereško
5

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/

phil soady
sumber
1
Jika Anda tidak setuju setidaknya cukup sopan untuk membenarkan pandangan Anda
phil soady
-1

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.

Bryan Young
sumber