Desain Model-Tampilan -_____ yang Tepat

14

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.

KoratDragonDen
sumber
2
Blok tampilan memiliki kesalahan salin-tempel. Saya kira peluru terakhir harus berbunyi "Memiliki nol pengetahuan tentang model." Dan kalimat terakhir dari catatan tambahan 1 mungkin harus diakhiri dengan "model" bukan "jembatan" ??
Johannes S.

Jawaban:

7

Frasa Anda

"Apakah koordinator dan penerjemah antara Model dan Tampilan."

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

"Menginformasikan Jembatan ketika data berubah (untuk data Jembatan telah menyatakan minatnya)."

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:

"Mengizinkan pelanggan luar (yang tidak tahu apa-apa) untuk memantau keadaan atau hasil kalkulasinya."

Jika Model Anda tidak memiliki ketergantungan pada Pengontrol atau Tampilan Anda, lebih mudah untuk menguji dan jauh lebih portabel.

Larry OBrien
sumber
1
Jika perbedaan utama adalah jika Tampilan dapat atau tidak dapat mengamati Model, maka desainnya pasti lebih MVP; Tampilan dan Model tidak pernah diizinkan untuk berbicara langsung dalam desain yang saya gunakan.
KoratDragonDen
Tanggung jawab Model adalah kata-kata yang buruk, saya pikir. Model tidak benar-benar memiliki petunjuk atau peduli tentang siapa / apa / mengapa hal-hal yang ingin mendengarkannya, tetapi hanya akan mempublikasikan setiap perubahan yang telah dibuat untuk pelanggannya. Ini sepenuhnya konten untuk ada sendiri tanpa pelanggan dalam bentuk apa pun, dan tidak berusaha untuk meminta pelanggan baru.
KoratDragonDen
1
Kedengarannya seperti Anda punya desain yang bagus, kalau begitu. PS Alasan untuk mempertimbangkan MVC daripada MVP adalah bahwa, tanpa disiplin, Presenter dapat menjadi terlalu terbebani.
Larry OBrien
1
+1 untuk sekadar menyatakan perbedaan antara MVC dan MVP. Seperti OP, sisa internet membuat saya benar-benar bingung apakah akronim ini bahkan sedikit berbeda.
Ixrec
5

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.

Jules
sumber
Itu bisa menjelaskan mengapa saya mengalami begitu banyak kesulitan membungkus kepala saya di sekitar konsep. Terima kasih; senang mengetahui bahwa saya (mungkin) tidak melakukan sesuatu yang salah dengan konsep MVC.
KoratDragonDen
Untuk aplikasi web satu halaman modern, kita kembali ke pola MVC klasik di sisi klien.
kevin cline
2

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.

  • Jika ada koleksi pandangan per jembatan, maka jembatan itu adalah pengontrol.
  • Jika selalu ada satu tampilan per jembatan, maka jembatan adalah presenter.
  • Jika ada koleksi jembatan per tampilan, maka jembatan adalah model tampilan.

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

Jeffery Thomas
sumber
0

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

  • Status sinkronisasi dengan penyimpanan data
  • Menangani validasi data baru / yang diperbarui
  • Naikkan acara saat mereka mengubah status

Tampilan

  • Buat template
  • Tangani acara Model
  • Menangani acara DOM
  • Memediasi interaksi antara Model dan DOM

Pengontrol

  • Kelola paling banyak beberapa Model & Tampilan
  • Melacak Tampilan dalam sebuah wadah

Modul

  • Pengelompokan logis dari Controller dan Views & Models-nya
  • Bisa diuji
  • Kecil dan dapat dikelola (Tanggung Jawab Tunggal)
  • Mengkoordinasikan (melalui Kontroler) keadaan dan peristiwa Tampilan & Model yang dikandungnya
  • Bebas untuk menyajikan Tampilannya sendiri
  • Tidak bebas memilih tempat menyajikan Tampilannya

Manajer Tata Letak

  • Bertanggung jawab atas komposisi tata letak
  • Menentukan shell aplikasi di DOM dengan area yang Modul dapat menyajikan kontennya

Dispatcher

  • Mendengarkan Acara (via aliran PubSub global)
  • Bertanggung jawab untuk memuat Modul baru berdasarkan Acara
  • Menyerahkan Modul yang dimuat ke Manajer Tata Letak
  • Mengelola seluruh Modul seumur hidup (pembuatan, pembersihan, cache, dll)
  • Contoh acara:
    • Perubahan rute (termasuk rute pemuatan awal)
    • Interaksi pengguna
    • Acara modul muncul dari peristiwa Model karena perubahan status sisi server, dll

Aplikasi

  • Bertanggung jawab untuk pengaturan keseluruhan, Instantiates hal-hal seperti:
    • Dispatcher
    • Router
    • Aliran PubSub
    • Penebang
    • dll

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 .

Jess Telford
sumber