Saya telah menggunakan MVP dan MVC di masa lalu, dan saya lebih suka MVP karena mengontrol aliran eksekusi jauh lebih baik menurut saya.
Saya telah membuat infrastruktur saya (kelas datastore / repositori) dan menggunakannya tanpa masalah saat mengode data sampel, jadi sekarang saya pindah ke GUI dan menyiapkan MVP saya.
Bagian A
Saya telah melihat MVP menggunakan tampilan sebagai titik masuk, yaitu dalam metode view constructor yang menciptakan presenter, yang pada gilirannya menciptakan model, menghubungkan peristiwa yang diperlukan.
Saya juga telah melihat presenter sebagai titik masuk, di mana pandangan, model dan presenter dibuat, presenter ini kemudian diberi tampilan dan objek model dalam konstruktornya untuk menghubungkan peristiwa.
Seperti pada 2, tetapi model tidak diteruskan ke presenter. Sebaliknya model adalah kelas statis di mana metode dipanggil dan respons dikembalikan secara langsung.
Bagian B
Dalam hal menjaga tampilan dan model dalam sinkronisasi saya telah melihat.
Setiap kali nilai dalam tampilan berubah, yaitu
TextChanged
acara di .Net / C #. Ini menembakkanDataChangedEvent
yang dilewatkan ke dalam model, untuk membuatnya tetap sinkron setiap saat. Dan di mana model berubah, yaitu peristiwa latar belakang yang didengarnya, maka tampilan diperbarui melalui ide yang sama untuk memunculkan aDataChangedEvent
. Ketika seorang pengguna ingin melakukan perubahan,SaveEvent
ia akan menyala, meneruskannya ke dalam model untuk melakukan save. Dalam hal ini model meniru data tampilan dan memproses tindakan.Mirip dengan # b1, namun tampilan tidak disinkronkan dengan model setiap saat. Alih-alih ketika pengguna ingin melakukan perubahan,
SaveEvent
dipecat dan presenter mengambil detail terbaru dan meneruskannya ke dalam model. dalam hal ini model tidak tahu tentang data tampilan sampai diminta untuk menindaklanjutinya, dalam hal ini ia melewatkan semua detail yang diperlukan.
Bagian C
Menampilkan objek bisnis dalam tampilan, yaitu objek (MyClass) bukan data primitif (int, dobel)
Tampilan memiliki bidang properti untuk semua datanya yang akan ditampilkan sebagai objek domain / bisnis. Seperti
view.Animals
memaparkanIEnumerable<IAnimal>
properti, meskipun tampilan memprosesnya menjadi Node dalam TreeView. Kemudian untuk hewan yang dipilih itu akan dieksposSelectedAnimal
sebagaiIAnimal
properti.Pandangan tidak memiliki pengetahuan tentang objek domain, itu memperlihatkan properti untuk primitif / framework (.Net / Java) termasuk hanya tipe objek. Dalam hal ini presenter akan melewatkan objek adaptor objek domain, adaptor kemudian akan menerjemahkan objek bisnis yang diberikan ke kontrol yang terlihat pada tampilan. Dalam hal ini adaptor harus memiliki akses ke kontrol aktual pada tampilan, bukan sembarang tampilan sehingga menjadi lebih erat.
Bagian D
Beberapa tampilan digunakan untuk membuat kontrol tunggal. yaitu Anda memiliki tampilan yang kompleks dengan model sederhana seperti menyimpan objek dari berbagai jenis. Anda dapat memiliki sistem menu di samping dengan setiap klik pada item kontrol yang sesuai ditampilkan.
Anda membuat satu tampilan besar, yang berisi semua kontrol individu yang diekspos melalui antarmuka tampilan.
Anda memiliki beberapa tampilan. Anda memiliki satu tampilan untuk menu dan panel kosong. Tampilan ini menciptakan tampilan lain yang diperlukan tetapi tidak menampilkannya (terlihat = salah), tampilan ini juga mengimplementasikan antarmuka untuk setiap tampilan yang dikandungnya (yaitu tampilan anak) sehingga dapat terpapar ke satu presenter. Panel kosong diisi dengan tampilan lain (
Controls.Add(myview)
) dan ((myview.visible = true
). Peristiwa-peristiwa yang diangkat dalam pandangan "anak" ini ditangani oleh pandangan orang tua yang pada gilirannya meneruskan acara tersebut kepada presenter, dan sebaliknya visa untuk memasok acara kembali ke elemen anak.Setiap tampilan, baik itu tampilan induk utama atau anak kecil masing-masing ditransfer ke sana sendiri presenter dan model. Anda benar-benar dapat menjatuhkan kontrol tampilan ke bentuk yang sudah ada dan itu akan memiliki fungsionalitas siap, hanya perlu kabel ke presenter di belakang layar.
Bagian E
Jika semuanya memiliki antarmuka, sekarang berdasarkan bagaimana MVP dilakukan dalam contoh di atas akan mempengaruhi jawaban ini karena mereka mungkin tidak kompatibel lintas.
Semuanya memiliki antarmuka, View, Presenter, dan Model. Masing-masing ini jelas memiliki implementasi konkret. Bahkan jika Anda hanya memiliki satu tampilan, model, dan presenter yang konkret.
Tampilan dan Model memiliki antarmuka. Ini memungkinkan pandangan dan model berbeda. Presenter membuat / diberi objek tampilan dan model dan itu hanya berfungsi untuk menyampaikan pesan di antara mereka.
Hanya tampilan yang memiliki antarmuka. Model memiliki metode statis dan tidak dibuat, sehingga tidak perlu antarmuka. Jika Anda menginginkan model yang berbeda, presenter memanggil serangkaian metode kelas statis yang berbeda. Menjadi statis, Model tidak memiliki tautan ke presenter.
Pikiran pribadi
Dari semua variasi berbeda yang telah saya sajikan (kebanyakan saya mungkin telah menggunakan dalam beberapa bentuk) yang saya yakin ada lebih banyak. Saya lebih suka A3 menjaga logika bisnis dapat digunakan kembali di luar hanya MVP, B2 untuk lebih sedikit duplikasi data dan lebih sedikit peristiwa yang dipecat. C1 untuk tidak menambahkan di kelas lain, tentu saja menempatkan sejumlah kecil logika non unit yang dapat diuji ke dalam tampilan (bagaimana objek domain divisualisasikan) tetapi ini bisa ditinjau kode, atau hanya dilihat dalam aplikasi. Jika logikanya kompleks saya akan setuju untuk kelas adaptor tetapi tidak dalam semua kasus. Untuk bagian D, saya merasa D1 menciptakan tampilan yang terlalu besar setidaknya untuk contoh menu. Saya telah menggunakan D2 dan D3 sebelumnya. Masalah dengan D2 adalah Anda akhirnya harus menulis banyak kode untuk merutekan acara ke dan dari presenter ke tampilan anak yang benar, dan itu tidak kompatibel dengan drag / drop, setiap kontrol baru perlu lebih banyak kabel untuk mendukung presenter tunggal. D3 adalah pilihan saya yang lebih disukai tetapi menambahkan lebih banyak kelas sebagai presenter dan model untuk menangani tampilan, bahkan jika tampilan sangat sederhana atau tidak perlu digunakan kembali. Saya pikir campuran D2 dan D3 terbaik berdasarkan keadaan. Mengenai bagian E, saya pikir semua yang memiliki antarmuka bisa berlebihan saya sudah melakukannya untuk domain / objek bisnis dan sering melihat tidak ada keuntungan dalam "desain" dengan melakukannya, tetapi itu membantu dalam mengejek objek dalam pengujian. Secara pribadi saya akan melihat E2 sebagai solusi klasik, meskipun telah melihat E3 digunakan dalam 2 proyek yang telah saya kerjakan sebelumnya. Saya pikir campuran D2 dan D3 terbaik berdasarkan keadaan. Mengenai bagian E, saya pikir semua yang memiliki antarmuka bisa berlebihan saya sudah melakukannya untuk domain / objek bisnis dan sering melihat tidak ada keuntungan dalam "desain" dengan melakukannya, tetapi itu membantu dalam mengejek objek dalam pengujian. Secara pribadi saya akan melihat E2 sebagai solusi klasik, meskipun telah melihat E3 digunakan dalam 2 proyek yang telah saya kerjakan sebelumnya. Saya pikir campuran D2 dan D3 terbaik berdasarkan keadaan. Mengenai bagian E, saya pikir semua yang memiliki antarmuka bisa berlebihan saya sudah melakukannya untuk domain / objek bisnis dan sering melihat tidak ada keuntungan dalam "desain" dengan melakukannya, tetapi itu membantu dalam mengejek objek dalam pengujian. Secara pribadi saya akan melihat E2 sebagai solusi klasik, meskipun telah melihat E3 digunakan dalam 2 proyek yang telah saya kerjakan sebelumnya.
Pertanyaan
Apakah saya menerapkan MVP dengan benar? Apakah ada cara yang benar untuk melakukannya?
Saya telah membaca karya Martin Fowler yang memiliki variasi, dan saya ingat ketika saya pertama kali mulai melakukan MVC, saya mengerti konsepnya, tetapi pada awalnya tidak bisa mengetahui di mana titik masuknya, semuanya memiliki fungsi sendiri tetapi apa yang mengontrol dan menciptakan yang asli mengatur objek MVC.