Saya memahami peran model dan pandangan dalam pola Model-View-Controller, tapi saya kesulitan memahami mengapa pengontrol diperlukan.
Mari kita asumsikan kita sedang membuat program catur menggunakan pendekatan MVC; kondisi permainan harus menjadi model, dan GUI harus menjadi tampilan. Apa sebenarnya controller dalam hal ini?
Apakah ini hanya kelas terpisah yang memiliki semua fungsi yang akan dipanggil ketika Anda, katakanlah, klik ubin? Mengapa tidak melakukan semua logika pada model dalam tampilan itu sendiri?
design-patterns
mvc
Anne Nonimus
sumber
sumber
Jawaban:
Dengan menggunakan contoh Anda, Pengontrollah yang akan memutuskan apa langkah legal atau tidak. Pengendali akan membiarkan pandangan tahu bagaimana mengatur potongan-potongan di papan saat memulai menggunakan informasi yang diterima dari Model. Ada lebih banyak hal yang dapat ditangani oleh Controller tetapi kuncinya adalah memikirkan Business Logic pada layer itu.
Ada saat-saat ketika semua Controller lakukan adalah menyampaikan informasi bolak-balik, seperti halaman pendaftaran. Lain waktu Controller adalah bagian yang sulit dari pengembangan karena ada banyak hal yang perlu dilakukan pada lapisan itu seperti menegakkan aturan atau melakukan matematika yang rumit misalnya. Jangan lupakan Controller!
sumber
Kontroler adalah lem yang mengikat model dan tampilan bersama, dan itu juga isolasi yang membuat mereka terpisah. Model ini seharusnya tidak tahu apa-apa tentang tampilan dan sebaliknya (setidaknya dalam versi Apple MVC). Kontroler bertindak seperti adaptor dua arah, menerjemahkan tindakan pengguna dari tampilan menjadi pesan ke model dan mengonfigurasi tampilan dengan data dari model.
Menggunakan pengontrol untuk memisahkan model dan tampilan membuat kode Anda lebih dapat digunakan kembali, lebih dapat diuji, dan lebih fleksibel. Pertimbangkan contoh catur Anda. Model tersebut tentu saja akan mencakup status permainan, tetapi mungkin juga berisi logika yang memengaruhi perubahan kondisi permainan, seperti menentukan apakah suatu langkah legal atau tidak dan memutuskan kapan game selesai. Tampilan menampilkan papan catur dan potongan-potongan dan mengirim pesan ketika sepotong bergerak, tetapi tidak tahu apa-apa tentang makna di balik potongan, bagaimana masing-masing bagian bergerak, dll. Kontroler tahu tentang model dan tampilan serta keseluruhan alur program. Ketika pengguna menekan tombol 'permainan baru', itu adalah pengontrol yang memberitahu model untuk membuat permainan dan menggunakan status permainan baru untuk mengatur papan. Jika pengguna bergerak,
Lihatlah apa yang Anda dapatkan dengan menjaga model dan melihat secara terpisah:
Anda dapat mengubah model atau tampilan tanpa mengubah yang lain. Anda mungkin harus memperbarui controller ketika Anda mengubah salah satu, tetapi dengan cara ini merupakan bagian dari keuntungan: bagian-bagian dari program yang paling mungkin berubah terkonsentrasi di controller.
Model dan tampilan keduanya dapat digunakan kembali. Misalnya, Anda dapat menggunakan tampilan papan catur yang sama dengan umpan RSS sebagai model untuk menggambarkan permainan terkenal. Atau, Anda bisa menggunakan model yang sama dan mengganti tampilan dengan antarmuka berbasis web.
Sangat mudah untuk menulis tes untuk kedua model dan tampilan untuk memastikan bahwa mereka bekerja seperti seharusnya.
Baik model dan tampilan sering dapat memanfaatkan bagian standar: array, peta, set, string, dan wadah data lainnya untuk model; tombol, kontrol, bidang teks, tampilan gambar, tabel, dan lainnya untuk tampilan.
sumber
Ada banyak, banyak cara berbeda dalam menerapkan pola desain umum ini, tetapi ide dasarnya adalah untuk memisahkan berbagai masalah yang diperlukan. MVC adalah abstraksi yang bagus dalam arti bahwa:
Model : Mewakili data itu, apa pun yang mungkin berarti
Lihat : Merupakan antarmuka pengguna, apa pun artinya
Pengontrol : Merupakan lem yang menyebabkan model dan tampilan berinteraksi, apa pun artinya
Ini sangat fleksibel karena tidak menentukan banyak. Banyak orang membuang banyak bandwidth berdebat tentang apa arti setiap elemen, nama apa yang harus digunakan, dan apakah benar-benar ada 3 atau 2 atau 4 atau 5 komponen, tapi itu tidak ada gunanya tingkat tertentu.
Idenya adalah untuk memisahkan "potongan" logika yang berbeda sehingga mereka tidak tumpang tindih. Menyatukan materi presentasi Anda, menyatukan data Anda, menyatukan hal-hal logika Anda, menyatukan hal-hal komunikasi Anda. Dan seterusnya. Sampai batas tertentu, semakin sedikit bidang-bidang yang saling tumpang tindih ini, semakin mudah melakukan hal-hal menarik dengannya.
Hanya itu yang harus Anda khawatirkan.
sumber
Semua jawaban bagus sejauh ini. Dua sen saya adalah bahwa saya suka menganggap pengontrol terutama dibangun dengan pertanyaan seperti Apa dan di mana?
diizinkan? Saya tidak yakin tapi saya tahu di mana dan siapa yang harus ditanya (model).
Cuplikan kecil ini adalah contoh bagaimana saya mencoba mengingat abstraksi dan konsep yang ingin disampaikan oleh MVC. Apa, Di mana, dan Bagaimana tiga proses pemikiran utama saya.
Apa dan di mana => Pengontrol Bagaimana dan kapan => Model dan tampilan
Intinya tindakan pengontrol saya cenderung kecil dan kompak dan ketika membacanya terkadang terlihat seperti buang-buang waktu. Dalam pemeriksaan lebih dekat mereka bertindak sebagai petugas sinyal lalu lintas, menyalurkan berbagai permintaan kepada pekerja yang tepat tetapi tidak melakukan pekerjaan aktual apa pun sendiri.
sumber
Pengontrol dapat membantu mengabstraksi antarmuka Tampilan dan Model sehingga mereka tidak harus saling mengenal secara langsung. Semakin sedikit objek yang harus diketahui, semakin portabel dan unit yang bisa diuji.
Misalnya Model dapat memainkan instance lain dari dirinya sendiri melalui satu Controller. Atau Kontroler jaringan dapat menghubungkan dua objek Tampilan pemain secara bersamaan. Atau mungkin tes Turing di mana tidak ada yang tahu yang mana.
sumber
Ini benar-benar berperan ketika Anda berhadapan dengan penangan acara, tetapi Anda masih membutuhkan pengontrol untuk menangani interaksi antara tampilan dan model. Idealnya Anda tidak ingin pandangan tahu apa-apa tentang model. Pikirkan tentang hal ini, apakah Anda ingin jsp membuat semua panggilan basis data secara langsung? (Kecuali jika itu seperti pencarian login.) Anda ingin tampilan membuat data dan tidak memiliki logika bisnis, kecuali jika itu menampilkan logika rendering, tetapi bukan logika bisnis perse.
Di GWT, Anda mendapatkan pemisahan yang lebih bersih dengan MVP. Tidak ada logika bisnis apa pun (jika dilakukan dengan benar) dalam tampilan. Presenter bertindak sebagai pengontrol dan pandangan tidak memiliki pengetahuan tentang model. Data model hanya diteruskan ke tampilan.
sumber
Document-View (yaitu tampilan model) adalah model standar untuk sebagian besar aplikasi Windows yang ditulis dalam MFC sehingga harus berfungsi untuk banyak kasus.
sumber
Apakah Anda yakin tentang hal itu? (Setidaknya seperti yang dijelaskan sebelumnya) Maksud dari model ini adalah menjadi model domain. Tampilan seharusnya menampilkan model domain kepada pengguna. Pengontrol seharusnya memetakan input level rendah ke model level tinggi. Sejauh yang saya tahu alasannya adalah sesuatu di sepanjang baris: A) penggunaan SRP tingkat tinggi. B) Model itu dianggap sebagai bagian penting dari aplikasi jadi jauhkan barang yang tidak penting dan lebih cepat diganti. C) logika bisnis yang mudah diuji (dan skrip).
Bayangkan saja jika Anda ingin membuat program Catur Anda dapat digunakan oleh orang buta, tukar tampilan untuk versi yang terdengar, dan pengontrol yang bekerja dengan keyboard. Katakanlah Anda ingin menambahkan game melalui surat, tambahkan controller yang menerima teks. Versi bersih dari game? Kontroler yang menerima perintah dari soket akan melakukan pekerjaan itu. Tambahkan render 3d yang bagus untuk itu, tampilan baru yang keren. Nol perubahan model yang diperlukan Catur masih catur.
Jika Anda mencampur input dengan representasi model maka Anda kehilangan kemampuan itu. Tiba-tiba Catur bukan Catur, melainkan Catur dengan mouse yang berbeda dari Catur dengan koneksi keyboard atau jaringan.
sumber
Saya pikir MVC bodoh, mungkin di area tertentu itu berfungsi dengan baik tetapi secara pribadi bahkan situs web yang saya tulis tidak cocok untuk MVC. Ada alasan mengapa Anda mendengar frontend, backend, dan tidak pernah database-end atau sesuatu-end-lain
IMO harus ada API (backend) dan aplikasi yang menggunakan API (frontend). Saya kira Anda bisa memanggil permintaan GET controller (yang hanya memanggil api backend) dan html tampilan tetapi saya biasanya tidak mendengar orang berbicara tentang tampilan sebagai html murni atau model menjadi API backend.
IMO semuanya harus menjadi API yang solid. Sebenarnya mereka tidak perlu solid (seperti dalam clean and well built) tetapi internalnya harus tetap pribadi dan aplikasi / frontend / di luar api tidak boleh mengatakan koneksi database atau membuat permintaan mentah.
Sekarang jika kode / desain Anda melibatkan lem dengan baik. Jika dalam permainan catur Anda ada beberapa markup yang dapat Anda edit untuk menguliti GUI, gui mengumpulkan coords / input dan memanggil MovePiece (srcPosition, dstPostion) (yang dapat mengembalikan bool atau enum untuk mengatakan apakah itu langkah yang valid atau tidak ) dan ok Anda dengan semua logika yang ada dalam model maka yakin menyebutnya MVC. Namun saya masih mengatur berbagai hal berdasarkan kelas dan API dan memastikan tidak ada kelas kitchen-sink yang menyentuh segalanya (atau API apa pun yang harus tahu tentang segala hal).
sumber
Pikirkan browser yang menampilkan halaman web statis. Modelnya adalah HTML. Tampilan adalah hasil aktual di layar.
Sekarang tambahkan beberapa JavaScript. Itu adalah Controller. Ketika pengguna mengklik tombol atau menyeret sesuatu Acara dikirim ke JavaScript, ia memutuskan apa yang harus dilakukan dan mengubah HTML (Model) yang mendasarinya dan browser / renderer menampilkan perubahan-perubahan itu di layar (Lihat).
Mungkin tombol lain diklik, acara dikirim ke pengendali (pengendali), dan mungkin menyebabkan permintaan untuk data lebih lanjut dikirim ke layanan web. Hasilnya kemudian ditambahkan ke HTML (Model).
Pengontrol merespons peristiwa dan mengontrol apa yang ada dalam Model dan karenanya apa yang ada di layar / Tampilan.
Melangkah mundur sedikit, Anda dapat menganggap seluruh browser sebagai Tampilan dan server sebagai Pengontrol dan data sebagai Model. Ketika pengguna mengklik sebuah tombol di browser kejadian yang dikirim ke server (Pengendali), ia mengumpulkan sumber daya bersama-sama sebagai halaman HTML (Model) dan mengirimkan kembali ke browser untuk ditampilkan (Lihat)
Turun di server apakah itu asp, php, atau java 'kode' (Pengendali) menerima acara klik dan meminta database atau repositori dokumen (Model) dan membuat HTML. Dari sudut pandang server, hasil dari semua tindakannya adalah Tampilan (HTML) dari datastore yang mendasarinya (Model). Tetapi dari sudut pandang klien, hasil dari permintaannya ke server adalah Modelnya (HTML)
Bahkan jika Anda mengacaukan JavaScript dalam HTML atau PHP Anda dalam HTML, Model, View, Controller masih ada. Bahkan jika Anda memikirkan permintaan Anda ke server dan respons balik dari server sebagai jalan dua arah yang sederhana, masih ada Model, View, dan Controller.
sumber
Dalam pengalaman saya, dalam program desktop tradisional mvc gui, controller akhirnya terperangkap dalam tampilan. Sebagian besar orang tidak meluangkan waktu untuk mempertimbangkan kelas pengontrol.
buku gang-of-four mengatakan:
sumber