MVP (Pengawas Supervisi) Apakah tampilan memperbarui model?

9

Saya telah membaca tentang MVP, khususnya Supervising Controller. Satu hal yang saya mengalami kesulitan membungkus kepala saya adalah bagaimana Lihat berinteraksi dengan Model.

Menurut pemahaman saya, Presenter harus memperbarui Model dan bahwa Tampilan dibaca dari Model. Presenter juga dapat memperbarui tampilan melalui antarmuka. Artikel Martin Fowler tentang ini tampaknya menunjukkan hal itu ( http://martinfowler.com/eaaDev/SupervisingPresenter.html ).

Namun, artikel / blog lain memperlihatkan pandangan memperbarui model secara langsung ( https://blogs.msdn.microsoft.com/erwinvandervalk/2009/08/14/the-difference-between-model-view-viewmodel-and-other- pola presentasi terpisah / ).

Saya tahu ini hanya pola sehingga akan ada implementasi yang berbeda, tetapi pandangan memperbarui model sepertinya melakukan lebih dari yang seharusnya.

Katakanlah misalnya saya punya kelas orang yang berisi nama dan nomor telepon. Tampilan dapat menampilkan nama dan nomor ini dan tombol kirim untuk mengubah nama dan nomor orang tersebut. Ketika tombol kirim diklik saya akan mengharapkan pembaruan akan ditangani di Presenter bukan View. Namun, artikel yang saya referensikan mengusulkan agar tampilan dapat langsung memperbarui model.

Jadi, haruskah tampilan memperbarui model? Atau haruskah itu hanya ditangani oleh Presenter?

EDIT:

Kode dari artikel MSDN:

public class PersonalDataView : UserControl, IPersonalDataView
{
    protected TextBox _firstNameTextBox;

    public void SetPersonalData(PersonalData data)
    {
        _firstNameTextBox.Value = data.FirstName;
    }

    public void UpdatePersonalData(PersonalData data)
    {
        data.FirstName = _firstNameTextBox.Value;
    }
}
Eric
sumber

Jawaban:

6

Ada beberapa varian MVP sejak desain aslinya pada tahun 1996 oleh Mike Potel . Martin Fowler membahas beberapa di antaranya dalam artikel lain tentang arsitektur GUI .

Salah satu perbedaan utama antara varian adalah apakah tampilan benar - benar terisolasi dari model atau tidak:

  • Dalam kasus pertama, presenter adalah laki-laki di tengah "pandangan pasif" dan modelnya.
  • Dalam kasus kedua, presenter adalah "pengawas pengawasan", tetapi ada interaksi langsung antara tampilan dan model. Makalah Potel menggambarkan dengan baik jenis interaksi: tampilan dapat meminta data dari model, dan model dapat memberi tahu tampilan beberapa peristiwa.

Dalam kasus tidak ada pandangan akan langsung mengubah model. Perubahan model selalu melalui Presenter (atau pengontrol dalam MVC).

Catatan 1: Artikel MSDN hanya menunjukkan satu panah langsung dari tampilan ke model, dalam pengantar pada bagian MVC (Model View Controller). Panah berada di arah yang salah, tetapi teksnya benar: tampilan dapat mengakses ke model, dan mengubah dirinya sendiri (yaitu bukan model, tetapi menggambar ulang dirinya sendiri) atas perubahan data model.

Catatan 2: Artikel MSDN juga menunjukkan pola MVVM Microsoft, yang kira-kira merupakan MVP, tetapi presenternya secara ambigu disebut "ViewModel". Tetapi sekali lagi, tampilan di dalamnya tidak memperbarui model secara langsung.

Hasil edit Anda:

Kode hasil edit Anda menunjukkan pengikatan data dua arah, tempat pembaruan data dalam tampilan akan memicu perubahan langsung pada model. Ini memang bertentangan dengan pola MVP asli di mana View menginformasikan Presenter perubahan yang diinginkan melalui "Interactor" dan Presenter memiliki monopoli untuk memanggil "Commands" untuk memperbarui Model.

Catatan 3: Saya pikir penulis blog MSDN ini lebih tertarik memperkenalkan arsitektur MVVM daripada menulis artikel mendalam yang komprehensif, seperti yang dilakukan Martin Fowler, pada arsitektur lain. Saya pikir juga bahwa arsitektur penyatuan data ADO Microsoft yang berasal dari hari-hari awal kerangka kerja .net disukai desain campuran dan membuat MVP klasik kurang sepele untuk diimplementasikan (diperlukan DataObjectSource untuk mengisolasi akses model data).

Christophe
sumber
1
Terima kasih atas balasannya. Saya mengedit pertanyaan saya. Artikel MSDN menjelaskan Pengontrol Pengawasan MVP dan menunjukkan di mana model dilewatkan sebagai parameter dalam metode UpdatePersonalData. Metode itu kemudian secara langsung memperbarui model. Itu tampaknya bertentangan dengan apa yang Anda katakan ketika Anda mengatakan "Tidak ada kasus akan melihat langsung mengubah model. Perubahan model selalu berjalan melalui Presenter (atau pengontrol dalam MVC)". Saya tidak terlalu menyukai ide model yang diperbarui dalam tampilan dan saya setuju dengan interpretasi Anda. Apakah hanya itu, interpretasi?
Eric
1
@ EricS Saya pikir penulis artikel blog MSDN ini salah mengartikan istilah "akses data" dalam MVP sebagai pengikatan data dua arah. Saya mengedit jawaban saya untuk menyoroti itu.
Christophe
1
@ EricS By the way, istilah pengikatan data antara tampilan dan model dikonfirmasi dibatasi dalam artikel Martin Fowler "Pandangan biasanya menggunakan beberapa bentuk Pengikatan Data untuk mengisi banyak informasi untuk bidangnya. Di mana Pengikatan Data tidak sampai untuk interaksi yang lebih kompleks maka langkah controller masuk. "
Christophe
1
Saya masih mencoba untuk membungkus kepala saya di sekitar data yang mengikat dan apa itu sebenarnya dan tidak. Tanpa kerangka kerja untuk melakukan pengikatan data apa pun untuk saya, dapatkah saya menerapkan pengikatan data sendiri dengan hanya menggunakan getter dan setter? Dalam hal itu, jika saya hanya ingin menerapkan pengikatan data satu arah, saya hanya akan memiliki pengambil yang mendapatkan data dari model, tetapi tidak pernah memperbarui model. Sebaliknya memperbarui model akan didelegasikan ke presenter.
Eric
1

Dari artikel Presenter Pembimbing Fowler yang Anda tautkan dalam pertanyaan Anda:

Faktor UI menjadi tampilan dan pengontrol di mana tampilan menangani pemetaan sederhana ke model yang mendasarinya dan pengontrol menangani respons input dan logika tampilan kompleks.

Dikatakan dengan jelas bahwa untuk semua tugas sederhana, tampilan dapat berbicara langsung dengan model. Jadi itu tidak bertentangan dengan artikel MSDN. Ini tepat karena untuk pemetaan sederhana / pengikatan properti Anda tidak perlu melibatkan lapisan lain karena ini hanya akan mempersulit hal-hal tanpa banyak manfaat.

Sekali lagi, Fowler membicarakan hal ini di akhir artikel:

[...] masalah mengemudi adalah seberapa banyak perilaku yang tersisa dalam tampilan. Tampilan Pasif adalah pola yang sangat mirip dengan Kontroler Pengawas, tetapi dengan perbedaan bahwa Tampilan Pasif menempatkan semua perilaku pembaruan tampilan di controller, termasuk kasus sederhana. Ini menghasilkan pemrograman ekstra, tetapi tidak berarti bahwa semua perilaku presentasi dapat diuji. Pilihan di antara keduanya tergantung pada jenis dukungan Pengikatan Data apa yang Anda miliki dan apakah Anda senang membiarkannya tidak teruji oleh tes pengontrol.

Anda harus mengingat beberapa hal:

  • Pastikan bahwa setiap saat model adalah "master" dari data itu. Ini berarti bahwa Tampilan tidak boleh menulis langsung ke bidang model (lagi pula ide yang buruk). Properti tidak masalah jika bahasa Anda mendukungnya. Dengan cara ini, model masih dapat bereaksi terhadap pembaruan apa pun terhadap datanya (misalnya dengan menghitung bidang lain).
  • Jangan gabungkan model Anda dengan tampilan. Model harus dapat diuji secara independen dan pada prinsipnya Anda harus dapat mengubah tampilan tanpa mempengaruhi model. Ini berarti model tidak boleh secara langsung memanggil tampilan. Gunakan antarmuka, atau mungkin yang terbaik di sini, pola Observer. Tampilan dapat berlangganan sendiri ke model untuk pembaruan.
  • Jangan pernah memasukkan logika (bisnis) apa pun ke dalam Tampilan. Jika Anda menemukan diri Anda menulis ifpernyataan dalam kode tampilan, pikirkan apakah itu seharusnya menjadi bagian dari presenter atau model.
jhyot
sumber