Model-View-Controller: Apakah pengguna berinteraksi dengan View atau dengan Controller? [Tutup]

14

Saya baru-baru ini belajar tentang pola desain MVC. Saya belajar dari buku Pola Desain Kepala Pertama.

Menurut buku ini (jika saya mengerti dengan benar):

Model adalah sebagian besar logika aplikasi dan data.

Tampilan pada dasarnya adalah GUI yang mewakili Model secara visual kepada pengguna.

Pengendali bertanggung jawab untuk 'menengahi', dan bertindak sebagai 'perantara' antara Tampilan dan Model. Lihat melaporkan ke Pengendali bahwa pengguna membuat tindakan, dan Pengendali menerjemahkannya ke panggilan metode pada Model.

Namun, banyak tempat di web bertentangan dengan apa yang saya pahami dari buku itu. Mereka mengklaim bahwa umumnya pengguna berinteraksi dengan Controller, bukan View.

Mana yang benar atau lebih umum? Apakah pengguna berinteraksi dengan Controller secara langsung, atau dengan View secara langsung? Apakah kedua pendekatan tersebut dapat diterima? Mana yang lebih umum?

Aviv Cohn
sumber
4
Pertanyaan ini tidak bermakna dijawab seperti cara Anda menulisnya. Beri kami contoh salah satu tempat di web yang bertentangan dengan buku itu, dan kami akan mencoba menjelaskannya. Jadilah spesifik dengan contoh Anda.
Robert Harvey
1
2 jawaban, keduanya di-upgrade, yang satu mengatakan "berinteraksi dengan tampilan" yang lain mengatakan "berinteraksi dengan controller" .... membuat saya berpikir MVC tidak cukup bagus jika arsitekturnya yang membingungkan pada tingkat mendasar seperti itu!
gbjbaanb
Apakah Anda mengklik kontrol aplikasi atau pada permintaan basis data? Interaksi secara langsung dengan antarmuka pengguna, yang merupakan tampilan. Tampilan biasanya meminta permintaan ke server (jika ada aplikasi web) atau memanggil pengait yang terdaftar pada mereka (jika ada aplikasi klien). Selain itu seluruh MVC hanya omong kosong.
luke1985
@spectre Tidak berguna untuk memberhentikan MVC tanpa memberikan penjelasan dan, idealnya, sebuah alternatif. Kalau tidak, pemberhentian itu tidak berkontribusi apa-apa dan seharusnya ditinggalkan begitu saja dari komentar Anda. Selain itu, bahkan dengan itu, itu masih di luar topik.
underscore_d

Jawaban:

18

Pengguna berinteraksi dengan View , tetapi View harus mengkomunikasikan tindakan ke Controller . The Pengendali dapat memperbarui Model , tetapi tidak diperlukan dengan setiap / perubahan.

Deskripsi yang saya berikan didasarkan pada pengalaman pribadi saya dengan implementasi .NET dari MVC. Implementasi Anda bisa berbeda.

The Pengendali adalah di mana tindakan diproses, pada dasarnya lapisan bisnis. Pengontrol sederhana tidak akan melakukan apa pun selain mendapatkan data dari Model untuk dimasukkan ke View. Pengendali yang rumit akan melakukan segala macam tindakan, hingga manajemen keamanan, otentikasi, otorisasi, pendaftaran, dan mungkin banyak hal lainnya.

The View seharusnya hanya bertanggung jawab untuk menampilkan informasi dengan cara yang pengguna dapat mengerti. Mungkin ada beberapa silang di sini dengan Controller dan Model karena hal-hal seperti Aplikasi Halaman Tunggal (SPA) akan memiliki umpan balik validasi data untuk pengguna. Semua cross over sangat disukai.

The Model berhubungan dengan data. Ini termasuk validasi data (jika ada). Penyimpanan dan pengambilan data juga ditangani di lapisan ini.


MEMPERBARUI

Tampaknya ada beberapa kebingungan di sekitar siapa melakukan apa kapan. Saya menyertakan dua ikhtisar berbeda dari arsitektur MVC karena mereka mirip, tetapi tidak sama. Ada ruang untuk kedua interpretasi. Mungkin, masih banyak lagi. Deskripsi di atas adalah interpretasi saya terhadap MVC dari berbagai sumber, termasuk pengalaman saya sendiri membangun aplikasi menggunakan metodologi ini. Semoga pembaruan ini akan membantu menjernihkan beberapa kebingungan ini.

MVC adalah upaya untuk membangun pola desain Pemisahan Kekhawatiran untuk pengembangan perangkat lunak. Ini terutama telah diterapkan dalam aplikasi berbasis web (setahu saya).

The View menangani semua interaksi pengguna. Jika pengguna mengklik tombol, tampilan menentukan apakah klik itu adalah interaksi antarmuka pengguna atau sesuatu yang berada di luar masalah (interaksi Pengontrol). Jika tombol melakukan sesuatu seperti menyalin nilai dari satu bidang ke bidang lain, implementasi Anda akan menentukan apakah itu masalah tampilan atau masalah pengontrol. Kemungkinan besar Anda hanya akan memiliki kekuatiran yang kabur ini ketika berhadapan dengan Aplikasi Halaman Tunggal (SPA).

The Pengendali adalah di mana tindakan Anda diproses. Tampilan telah mengkomunikasikan pengguna memutuskan untuk mengubah nilai untuk beberapa bidang. Pengontrol dapat melakukan validasi pada data tersebut atau dapat ditangani oleh Model. Sekali lagi ini tergantung pada implementasi. Jika Controller memiliki fitur keamanan, itu mungkin menentukan bahwa pengguna tidak memiliki hak yang cukup untuk melakukan tindakan. Itu akan menolak perubahan dan memperbarui tampilan yang sesuai. Pengontrol juga menentukan data apa yang akan diambil dari Model, cara mengemasnya, dan memperbarui Tampilan dengan data itu.

The Model menentukan bagaimana dan di mana untuk menyimpan data. Mungkin juga melakukan validasi data itu sebelum menyimpannya (itu harus dilakukan karena orang akan mem-bypass View pada kesempatan).


Wikipedia memiliki artikel tentang MVC .

  • Sebuah model memberi tahu tampilan / pengontrol dan pengait terkait saat ada perubahan kondisi. Pemberitahuan ini memungkinkan pandangan untuk memperbarui presentasi mereka, dan pengontrol untuk mengubah set perintah yang tersedia. Dalam beberapa kasus, implementasi MVC mungkin malah "pasif," sehingga komponen lain harus memilih model pembaruan daripada diberi tahu.
  • Sebuah pandangan yang diberitahu oleh controller semua informasi yang dibutuhkan untuk menghasilkan output representasi kepada pengguna. Ini juga dapat memberikan mekanisme umum untuk menginformasikan pengontrol input pengguna.
  • Sebuah kontroler dapat mengirimkan perintah ke model untuk memperbarui negara model (misalnya, mengedit dokumen). Ia juga dapat mengirim perintah ke tampilan terkait untuk mengubah presentasi tampilan model (misalnya, dengan menggulir dokumen).

Dari Ikhtisar Microsoft tentang MVC .

  • Model. Objek model adalah bagian dari aplikasi yang menerapkan logika untuk domain data aplikasi. Seringkali, objek model mengambil dan menyimpan status model dalam database. Misalnya, objek Produk mungkin mengambil informasi dari database, beroperasi di atasnya, dan kemudian menulis informasi yang diperbarui kembali ke tabel Produk di database SQL Server.

    Dalam aplikasi kecil, model seringkali merupakan pemisahan konseptual, bukan pemisahan fisik. Misalnya, jika aplikasi hanya membaca dataset dan mengirimkannya ke tampilan, aplikasi tidak memiliki lapisan model fisik dan kelas terkait. Dalam hal itu, dataset mengambil peran objek model.

  • Tampilan. Tampilan adalah komponen yang menampilkan antarmuka pengguna aplikasi (UI). Biasanya, UI ini dibuat dari data model. Contohnya adalah tampilan edit tabel Produk yang menampilkan kotak teks, daftar drop-down, dan kotak centang berdasarkan keadaan saat ini dari objek Produk.

  • Pengontrol. Controllers adalah komponen yang menangani interaksi pengguna, bekerja dengan model, dan akhirnya memilih tampilan untuk menyajikan yang menampilkan UI. Dalam aplikasi MVC, tampilan hanya menampilkan informasi; controller menangani dan merespons input dan interaksi pengguna. Sebagai contoh, pengontrol menangani nilai-nilai kueri-string, dan meneruskan nilai-nilai ini ke model, yang pada gilirannya mungkin menggunakan nilai-nilai ini untuk query database.

Adam Zuckerman
sumber
Bagaimana jika Anda tidak memiliki GUI untuk semua tindakan? Bagaimana jika Anda hanya menerapkan API untuk beberapa bagian tertentu? Apakah itu berarti pengguna terkadang berinteraksi dengan View dan terkadang dengan Controller secara langsung?
Mahdi
1
Dari sudut pandang saya, tidak. API menggantikan tampilan.
Adam Zuckerman
tetapi API bisa menjadi sederhana url-routes, ditempatkan di Controller. Maksud saya sama sekali tidak Lihat ...
Mahdi
1
@AdamZuckerman Terima kasih telah menjawab. Dalam komentar berikutnya saya akan menjelaskan bagaimana menurut saya implementasi MVC umum berfungsi, harap konfirmasikan apakah itu benar atau tidak. Terima kasih
Aviv Cohn
2
@ Mahdi An API, menurut definisi, ada sebagai antarmuka pemrograman , bukan antarmuka pengguna . Program berinteraksi dengan API, pengguna berinteraksi dengan View.
Eric King
4

Pengguna berinteraksi dengan Controller . Dari sudut pandang teknis Anda tidak berinteraksi dengan View , Anda hanya menggunakannya untuk berinteraksi dengan Controller .

Pada permukaan tampaknya pengguna berinteraksi dengan GUI - juga untuk non-programmer ini lebih masuk akal, namun dengan mengklik tombol Anda pada dasarnya berbicara dengan Controller bukan View .

Juga tidak semua aplikasi - bahkan aplikasi web MVC, memang memiliki GUI. Anda dapat berinteraksi dengan Controller melalui API - url-routescontohnya sederhana saja , ditempatkan di Controller itu sendiri.

The Pengendali harus menjadi tempat yang Menerima dan Menangani permintaan pengguna. Jadi jika Anda entah bagaimana mengakses Model langsung dari View - tidak masalah bagaimana, maka itu bukan MVC lagi.

Mahdi
sumber
2
+1 Ini benar. Hal-hal seperti menu dan toolbar adalah bagian dari GUI tetapi bukan bagian dari tampilan, dan langsung ke controller. Menekan tombol juga.
david.pfx
1
Alasan pandangan ada sebagai abstraksi adalah agar kita dapat menggantinya dengan mudah bila perlu. Pengontrol untuk aplikasi pada berbagai platform bisa sama, tetapi pandangan harus mengenali gerakan pengguna secara berbeda dan menerjemahkannya ke dalam operasi pengontrol. Saya tidak setuju, oleh karena itu, bahwa pengguna berinteraksi langsung dengan pengontrol.
Fuhrmanator
1
@ Mahdi Saya akan mengatakan bahwa dalam hal itu, tidak ada interaksi pengguna sama sekali, itu pandangan berkomunikasi dengan controller secara terprogram. Satu-satunya interaksi yang diprakarsai oleh pengguna adalah melalui tampilan.
Eric King
1
@ david.pfx Keystrokes tidak dapat langsung dari jendela browser ke Controller.
Adam Zuckerman
1
@Izkata "The View adalah bagian dari kode yang permintaannya dikirim ke" - Maaf tapi ini adalah hal terburuk yang saya dengar di sini. Bagaimana itu mungkin? Bisakah Anda mencadangkannya dengan memberikan referensi dalam artikel atau buku?
Mahdi
1

Mari kita gunakan contoh konkret mengapa pengguna berinteraksi langsung dengan tampilan dan bukan pengontrol.

Di aplikasi musik di iPhone, fitur tingkat tinggi adalah memainkan daftar putar. "Play a playlist" adalah fungsi pengontrol untuk aplikasi.

Ada lebih dari satu cara untuk mengaktifkan fungsi itu. Saya dapat mengklik daftar putar di dalam aplikasi, atau saya dapat meminta Siri (antarmuka suara) untuk melakukan fungsi yang sama. Itu adalah dua gerakan berbeda yang dikenali oleh berbagai pandangan.

Umpan balik di setiap tampilan juga berbeda. Siri akan memberi tahu Anda bahwa itu memainkan musik yang Anda minta. Aplikasi musik akan menunjukkan kepada Anda umpan balik visual bahwa ia sedang memainkan daftar putar.

Fuhrmanator
sumber