Aby odpowiedzieć na pytanie: Tak, każdy widok powinien mieć własny model widoku. Ale nie ma potrzeby modelowania całej hierarchii. Tylko to, czego potrzebuje widok.
Problem, który miałem z większością zasobów internetowych dotyczących MVVM:
W większości przykładów widok jest prawie odwzorowaniem modelu w stosunku 1 do 1. Ale w moim scenariuszu, w którym istnieją różne widoki dla różnych aspektów tego samego modelu, utknąłem między dwiema opcjami:
Jeden monolityczny model widoku używany przez wszystkie inne modele widoku
Lub jeden model widoku dla każdego widoku
Ale oba nie są idealne.
Model widokowy zorientowany na model (MVM), mimo niskiego poziomu duplikacji kodu, jest koszmarem do utrzymania
Model widoku zorientowany na widok (VVM) tworzy wysoce wyspecjalizowane klasy dla każdego widoku, ale zawiera duplikaty.
Ostatecznie zdecydowałem, że posiadanie jednej maszyny wirtualnej na widok jest łatwiejsze w utrzymaniu i kodowaniu, więc zdecydowałem się na podejście VVM.
Gdy kod działa, zacząłem refaktoryzować wszystkie typowe właściwości i operacje do jego obecnej, końcowej postaci:
W tej ostatecznej formie klasa wspólnego modelu widoku składa się z każdej VVM.
Oczywiście nadal muszę zdecydować, co jest uważane za wspólne / specjalistyczne. A gdy widok zostanie dodany / scalony / usunięty, to saldo się zmienia.
Ale fajną rzeczą jest to, że jestem teraz w stanie przesuwać członków w górę / w dół ze wspólnego do VVM i odwrotnie.
I krótka uwaga na temat synchronizacji obiektów:
Posiadanie modelu wspólnego widoku zajmuje się większością tego. Każda VVM może po prostu mieć odniesienie do tego samego modelu widoku wspólnego.
Zaczynam też od prostych metod wywołania zwrotnego i ewoluuję do zdarzenia / obserwatora, jeśli pojawi się potrzeba wielu słuchaczy.
W przypadku naprawdę skomplikowanych zdarzeń (tj. Nieoczekiwanych aktualizacji kaskadowych) przejdę na używanie Mediatora.
Nie unikam kodu, w którym dziecko ma odniesienie do swojego rodzica. Wszystko, żeby kod działał.
A jeśli pojawi się okazja do refaktoryzacji, skorzystam z niej.
Lekcje, których się nauczyłem:
- Kod brzydki / roboczy> Piękny / niedziałający kod
- Łatwiej jest połączyć wiele małych klas, niż rozbić ogromną klasę