Щоб відповісти на питання, так, у кожного представлення повинна бути своя модель перегляду. Але не потрібно моделювати всю ієрархію. Тільки те, що потрібно перегляду.
Проблема, з якою у мене виникло більшість інтернет-ресурсів щодо MVVM:
У більшості прикладів Вид - це майже 1-на-1 відображення моделі. Але в моєму сценарії, де існують різні погляди на різні аспекти однієї моделі, я опиняюся між двома варіантами:
Одна монолітна модель виду, яка використовується всіма іншими моделями перегляду
Або одна модель перегляду для кожного перегляду
Але обидва не є ідеальними.
Модель, орієнтована на модель (MVM), хоч і мала дублювання коду, є кошмаром для підтримки
Модель перегляду, орієнтована на перегляд (VVM), створює вузькоспеціалізовані класи для кожного перегляду, але містить дублікати.
Зрештою, я вирішив, що мати один VM на перегляд простіше в обслуговуванні та кодуванні, тому я пішов із підходом VVM.
Як тільки код працює, я почав рефакторинг усіх загальних властивостей і операцій у його поточну, остаточну форму:
У цій заключній формі клас моделей загального виду складається в кожен VVM.
Звичайно, мені все ж належить вирішити, що вважається загальним / спеціалізованим. І коли вигляд додається / об'єднується / видаляється, цей баланс змінюється.
Але приємна річ у тому, що я зараз в змозі підштовхувати / зменшувати членів від загального до VVM і навпаки легко.
І коротка примітка щодо синхронізації об'єктів:
Маючи загальну модель перегляду, це забезпечує більшу частину цього. Кожен VVM може просто мати посилання на ту саму загальну модель перегляду.
Я також схильний починати з простих методів зворотного виклику і еволюціонувати до події / спостерігача, якщо виникає потреба у кількох слухачів.
А для дійсно складних подій (тобто несподіваних каскадних оновлень) я перейшов би на використання Посередника.
Я не цураюся коду, коли дитина має зворотну посилання на свого батька. Все, щоб привести код в дію.
І якщо з’явиться можливість рефактора, я б скористався цим.
Уроки, які я засвоїв:
- Некрасивий / робочий код> Красивий / неробочий код
- Легше об’єднати кілька малих класів, ніж розбити величезний клас