Untuk menjawab pertanyaan, Ya, setiap tampilan harus memiliki Model Tampilan sendiri. Tetapi tidak perlu memodelkan seluruh hierarki. Hanya apa yang dibutuhkan tampilan.
Masalah yang saya miliki dengan sebagian besar sumber daya online tentang MVVM:
Dalam sebagian besar contoh, tampilan hampir 1-ke-1 pemetaan Model. Tetapi dalam skenario saya, di mana ada pandangan berbeda untuk berbagai sisi dari Model yang sama, saya menemukan diri saya terjebak di antara dua pilihan:
Satu model tampilan monolitik yang digunakan oleh semua model tampilan lainnya
Atau satu model tampilan untuk setiap tampilan
Namun keduanya tidak ideal.
Model-oriented View Model (MVM), meskipun duplikasi kode rendah, adalah mimpi buruk untuk dipertahankan
View-oriented View Model (VVM) menghasilkan kelas yang sangat terspesialisasi untuk setiap tampilan, tetapi berisi duplikat.
Pada akhirnya, saya memutuskan bahwa memiliki satu VM per Tampilan lebih mudah untuk dipelihara dan dikodekan, jadi saya menggunakan pendekatan VVM.
Setelah kode bekerja, saya mulai refactoring semua properti dan operasi umum ke dalam bentuk terakhirnya saat ini:
Dalam bentuk akhir ini, kelas model tampilan umum dikomposisikan ke dalam setiap VVM.
Tentu saja, saya masih harus memutuskan apa yang dianggap umum / terspesialisasi. Dan ketika tampilan ditambahkan / digabung / dihapus, saldo ini berubah.
Tapi yang menyenangkan tentang ini adalah, saya sekarang dapat mendorong anggota naik / turun dari yang umum ke VVM dan sebaliknya dengan mudah.
Dan catatan singkat tentang menjaga objek tetap sinkron:
Memiliki Model Pandangan Umum menangani sebagian besar dari ini. Setiap VVM dapat dengan mudah memiliki referensi ke Model Common View yang sama.
Saya juga cenderung memulai dengan metode panggilan balik sederhana, dan berkembang menjadi acara / pengamat jika kebutuhan akan banyak pendengar muncul.
Dan untuk acara yang sangat kompleks (yaitu, pembaruan cascading yang tidak terduga), saya akan beralih menggunakan Mediator.
Saya tidak menghindar dari kode di mana seorang anak memiliki referensi kembali ke orang tuanya. Apa pun agar kode berfungsi.
Dan jika kesempatan untuk refactor muncul, saya akan mengambilnya.
Pelajaran yang saya pelajari:
- Jelek / Kode kerja> Cantik / Kode tidak bekerja
- Lebih mudah untuk menggabungkan beberapa kelas kecil, daripada memecah kelas besar