Чтобы ответить на вопрос, да, у каждого представления должна быть своя модель представления. Но нет необходимости моделировать всю иерархию. Только то, что нужно мнению.
У меня возникла проблема с большинством онлайн-ресурсов, касающихся MVVM:
В большинстве примеров представление является почти однозначным отображением модели. Но в моем сценарии, где существуют разные представления для разных аспектов одной и той же модели, я застрял между двумя вариантами:
Одна модель монолитного представления, которая используется всеми другими моделями представления
Или одна модель представления для каждого представления
Но оба не идеальны.
Модель ориентированного на модель представления (MVM), несмотря на низкий уровень дублирования кода, является кошмаром для обслуживания
Модель представления с ориентацией на представление (VVM) создает узкоспециализированные классы для каждого представления, но содержит дубликаты.
В конце концов, я решил, что иметь одну ВМ на View проще в обслуживании и писать для кода, поэтому я остановился на подходе VVM.
Как только код заработал, я начал рефакторинг всех общих свойств и операций в его текущую, окончательную форму:
В этой окончательной форме класс модели общего вида состоит из каждого VVM.
Конечно, мне еще предстоит решить, что считать общим / специализированным. И когда представление добавляется / объединяется / удаляется, этот баланс меняется.
Но самое приятное в этом то, что теперь я могу перемещать элементы вверх / вниз от общего к VVM и наоборот.
И быстрое замечание относительно синхронизации объектов:
Наличие модели общего вида решает большую часть этого. Каждый VVM может просто иметь ссылку на одну и ту же модель общего вида.
Я также склонен начинать с простых методов обратного вызова и переходить к событию / наблюдателю, если возникает необходимость в нескольких слушателях.
А для действительно сложных событий (например, неожиданных каскадных обновлений) я бы переключился на использование посредника.
Я не уклоняюсь от кода, где у ребенка есть обратная ссылка на его родителя. Что-нибудь, чтобы код работал.
И если бы появилась возможность рефакторинга, я бы ее использовал.
Уроки, которые я выучил:
- Гадкий / Рабочий код> Красивый / Нерабочий код
- Проще объединить несколько маленьких классов, чем разбить огромный класс