Saya telah membaca tentang Pengendali Model View, Model View Presenter, Model View ViewModel, dan sebagainya, dan secara umum, konsep yang mendasarinya tampak cukup sederhana untuk dipahami: jaga agar visual dan ilmu yang cantik tetap terpisah dan bodoh satu sama lain. bisa jadi. Tidak mendapatkan logika selai kacang dalam cokelat desain; keren, aku suka itu.
Masalahnya adalah saya masih agak kabur untuk bagian ketiga ... yang tidak-model-atau-tampilan. Semua orang tampaknya memiliki ide mereka sendiri tentang apa yang disebutnya, apa yang harus dilakukan, apa yang pantas, apa yang salah ... dan saya akan mencoba mencari tahu kapan Presenter menjadi ViewModel dan ketika View tidak boleh t akan melakukan itu karena itulah pekerjaan Presenter dan--
Saya mengoceh.
Daripada meminta seseorang untuk menjelaskan perbedaan di antara mereka - karena itu sudah dilakukan berkali-kali (saya tahu; saya sudah membaca lebih banyak artikel daripada yang bisa saya hitung) - Saya ingin tahu mendengar pemikiran seorang beberapa programmer pada model saya telah dirakit sendiri.
Yang mengatakan, apa yang akan Anda mengklasifikasikan desain ini, dan mungkin yang lebih penting, apakah Anda melihat sesuatu tentang ini yang jelas-jelas menyebalkan? Tentu, saya ingin mendengar saya melakukan yang baik jika ini benar-benar desain yang solid, tetapi saya lebih suka diberi nasihat yang solid daripada pujian.
Catatan: Saya akan menggunakan "Jembatan" untuk bagian ketiga misterius Model-View-? untuk menghindari saran bawah sadar tentang apa yang "seharusnya".
Model
- Apakah otoritas pada data.
- Menerima informasi tentang perubahan yang diminta dari Jembatan.
- Berisi dan melakukan semua logika untuk bagaimana data terkait dengan data lainnya.
Menginformasikan Jembatan ketika data berubah (untuk data Jembatan telah menyatakan minatnya).Edit tulisan: Mengizinkan pelanggan luar (yang tidak tahu apa-apa) untuk memantau keadaan atau hasil perhitungannya.- Tidak memiliki pengetahuan tentang Tampilan.
Melihat
- Berkepentingan dengan menyediakan cara bagi pengguna untuk melihat dan memanipulasi data.
- Menerima informasi tentang pembaruan data dari Bridge.
- Berisi dan melakukan semua logika untuk bagaimana menyajikan data dan kontrol kepada pengguna.
- Menginformasikan Jembatan ketika pengguna telah melakukan tindakan yang (mungkin) mempengaruhi Model.
- Menginformasikan kepada Bridge informasi apa yang menarik baginya.
- Memiliki nol pengetahuan tentang Model.
Jembatan
- Apakah koordinator dan penerjemah antara Model dan Tampilan.
- Membuat perubahan pemformatan yang sesuai untuk informasi yang disampaikan antara Model dan Tampilan.
- Menyimpan informasi tentang "siapa yang perlu tahu apa".
- Memiliki pengetahuan tentang Model dan Tampilan.
catatan tambahan
- Dalam program yang lebih rumit, biasanya ada beberapa Model. Dalam situasi ini, Bridge biasanya bertugas mengoordinasi / menerjemahkan antara beberapa Model, dan dengan demikian menjadi otoritas pada apa model Protocall / API / design seharusnya dibangun. (mis. jika membuat program permainan kartu, dan Anda ingin membangun model pengocok geladak alternatif, Anda harus menggunakan Bridge untuk menentukan fungsi apa yang diperlukan untuk komunikasi yang benar dengan Bridge.)
- Dalam program kecil sederhana dengan hanya satu Tampilan dan Model, sudah umum bagi Bridge untuk "mengasumsikan" fungsionalitas apa yang tersedia di kedua sisi. Namun, ketika program menjadi lebih kompleks, direkomendasikan bahwa View (s) dan Model (s) melaporkan fungsionalitasnya ke Bridge sehingga dapat menghindari inefisiensi dan asumsi buggy.
Saya pikir hampir menutupinya. Dengan segala cara, saya menyambut setiap pertanyaan yang mungkin Anda miliki tentang desain yang cenderung saya gunakan, dan saya juga mendorong setiap saran.
Dan seperti biasa, terima kasih atas waktu Anda.
sumber
Jawaban:
Frasa Anda
menunjukkan bahwa Bridge Anda adalah Presenter dalam arsitektur MVP.
MVP dan MVC sangat mirip, kecuali bahwa dalam MVP hanya Presenter yang mengamati Model sementara di MVC, View juga diperbolehkan untuk mengamati Model secara langsung (tanpa Presenter sebagai "Jembatan").
Tanggung jawab Model Anda
mungkin diutarakan dengan buruk atau mungkin suatu kesalahan: Anda tidak ingin Model memiliki ketergantungan pada Bridge / Presenter / Controller atau View. Sebagai gantinya, Anda menggunakan salah satu pola Pengamat, Acara, atau Pemrograman Reaktif untuk memungkinkan Bridge berlangganan perubahan dalam Model. Dan kemudian Anda dapat menguraikan kembali tanggung jawab Anda sebagai:
Jika Model Anda tidak memiliki ketergantungan pada Pengontrol atau Tampilan Anda, lebih mudah untuk menguji dan jauh lebih portabel.
sumber
Saya menduga salah satu hal yang membingungkan Anda adalah bahwa ada dua pola yang sama sekali berbeda yang keduanya biasa disebut model-view-controller.
Ada yang asli, seperti yang diterapkan di smalltalk dan yang berguna untuk sistem gui lokal, dan ada apa yang saya anggap sebagai web-mvc, yang bertukar tanggung jawab pandangan dan pengontrol sehingga pengontrol dapat duduk di server dengan tampilan berada di klien (mungkin sebagai html yang diberikan, atau mungkin melalui ajax).
Deskripsi Anda kedengarannya seperti duduk di sebagian besar definisi web-mvc.
sumber
Ada banyak diskusi dalam komunitas pemrograman tentang nomenklatur yang tepat ini. Sepertinya tidak ada yang setuju tentang banyak hal.
Bagi saya, bagaimana jembatan ditransfer ke tampilan sebagian besar menentukan namanya.
Terkadang hal-hal tidak begitu jelas dipotong. Misalnya, seorang presenter dapat dihubungkan ke tampilan komposit yang dibuat dari beberapa subview atau pengontrol dapat dibuat tanpa sepengetahuan pandangannya. Meskipun demikian, saya pikir aturan saya adalah awal yang baik.
Sebagai catatan, saya ingin memasangkan tanggung jawab seperti ini:
Model
Tanggung Jawab Utama: Data yang
bertahan Peran Sekunder: Validasi pembaruan, beri tahu pengamat tentang pembaruan
Melihat
Tanggung Jawab Utama: Menyajikan data
Peran Sekunder: Menerima input, menunjukkan UX
Jembatan
Tanggung Jawab Utama: Memperbarui data
Peran Sekunder: Bersihkan input, sinkronisasi data, dan tampilan
sumber
Sementara pola yang disarankan Anda tampaknya benar di permukaan, dan tidak diragukan lagi akan berfungsi untuk kasus kecil, karena aplikasi Anda menjadi lebih kompleks, Anda akan menghadapi masalah di mana Anda tidak yakin tentang apa yang memperbarui apa, siapa yang mendengarkan di mana, dan mengapa saya mencoba untuk mengontrol begitu banyak Model dari dalam begitu banyak Tampilan, semua yang membutuhkan akses ke satu sama lain, dll.
Saya sarankan untuk memperluas ide Anda menggunakan pola berikut (diambil dari Amy Palamountain, Musuh Negara ):
Model
Tampilan
Pengontrol
Modul
Manajer Tata Letak
Dispatcher
Aplikasi
Pola semacam ini memungkinkan aplikasi Anda menjadi komposer, diuji unit, menghilangkan kompleksitas yang akan dibangun oleh Bridge dari waktu ke waktu, membuat masalah tetap terpisah dengan baik, dll.
Seperti yang ditunjukkan Amy: Berhati-hatilah untuk tidak membangun server pada klien. Dan berhati-hatilah untuk tidak jatuh ke dalam doktrin "Saya membuat kerangka kerja MV *, karena itu saya harus ___!" Alih-alih, ambil semua ide ini (dan jawaban lainnya di sini), dan temukan yang terbaik untuk aplikasi dan tim Anda.
Saya sangat merekomendasikan menonton pembicaraan Amy Palamountain, Musuh Negara (dari mana ide-ide ini datang), atau setidaknya untuk melihat slide dari pembicaraan .
sumber