(MVVM) Просмотр модели для просмотра или для модели? - PullRequest
0 голосов
/ 16 мая 2019

:)

В течение последних нескольких недель я смотрел и читал множество материалов MVVM, и, кажется, есть существенное отличие, которое все так или иначе делают, но не уточняют. Мы создаем ViewModel для View или для модели?

Есть вопрос для него, но я не думаю, что его ответил полностью. Так ..

Давайте использовать приложение Recipes, например, где у нас есть три различных представления: RecipesViewController, RecipeViewController и RecipeCell. Я думаю, что правильный способ реализации MVVM состоит в том, чтобы создать одну ViewModel для каждого представления вместо создания RecipeModel и делиться им между ними.

Этот пример может быть достаточно простым, и мы можем предпочесть одну ViewModel, но это не правильно, не так ли? И если оба приемлемы, кто-то может объяснить различия, недостатки и преимущества? И если у нас есть сетевой уровень, только ViewModel должен взаимодействовать с ним, верно?

Спасибо.

1 Ответ

2 голосов
/ 16 мая 2019

Шаблоны и архитектуры могут быть трудны для понимания, когда люди действительно думают, как правильно реализовать их.

Это всего лишь рекомендации. Они дают вам разделение обязанностей, и вы, как разработчик, решаете, как применять их в зависимости от вашей проблемы. Выполнять их одним способом может быть сложнее, чем делать их другим способом, и это почти все.

У паттерна нет способа решить все проблемы, которые у вас будут.

Из практики выяснилось, что в большинстве случаев View лучше общаться с одним ViewModel. Мой опыт доказал, что это действительно делает вашу логику более чистой, так как изменение пары ViewModel может сломать один View, а отладка и отслеживание происходящего может быть труднее. Если вам нужно разделить какое-то состояние и / или логику между Views, которая принадлежит одному ViewModel, подумайте, как вы можете иметь два ViewModels вместо одного, и добавьте Model, чтобы разделить это состояние и логику, и ViewModels поделитесь этим объектом.

A ViewModel может связываться с несколькими Views (в то время как каждый View имеет одну ViewModel). Большую часть времени, если вы можете сделать один ViewModel для связи с одним View, они это делают. Это облегчает жизнь.

Для сложной взаимосвязанной логики иногда бывает сложнее иметь один ViewModel на View. Обычно вы делите ваш ViewModel на иерархию, где у вас будет один ParentViewModel и пара меньших, более мелких, ChildViewModels. Но этим ChildViewModels, возможно, придется общаться со своими родителями или между собой. Разбивая ViewModels на иерархии, вы можете получить единый ViewModel для View, но если вы не можете не принуждать себя. Иногда проще этого не делать.

По крайней мере, не пытайтесь получить один ViewModel для View. Используйте итеративный подход и рефакторинг. Сделайте один больший ViewModel и подключите его к другому Views. Позже проведите рефакторинг вашего пути к разбивке MainViewModel на более мелкие и попытайтесь заставить их общаться с меньшим количеством возможных представлений.

Совместное использование Model между ViewModels - это прекрасно. Я думаю, что Models, вероятно, вещь, которая используется недостаточно. Люди пытаются добавить больше логики к ViewModels, создающему связь между ними, в то время как они должны использовать Models.

Одна важная вещь, о которой вам нужно подумать, - это разделение Презентация и Модель . Поработайте над своей моделью , и вы увидите большие преимущества.

Если в качестве примера у вас должна быть модель Recipe, так как Recipe является вашей DomainModel и должна иметь данные и поведение, связанные с рецептом. Тогда у вас будет RecipeViewModel, и вы будете частью Presentation и будете иметь логику презентаций для Recipe. Тогда у вас будет RecipeView, который будет подключен к RecipeViewModel, который отвечает за фактические графические элементы, представляющие, как Recipe Представлено для пользователь и реагировать и настраивать его виджеты / элементы управления на изменения в RecipeViewModel.

В MVVM Views обычно не связываются с Models. Они общаются с ViewModels, а затем общаются с Models.

Одна большая проблема, которую я вижу, состоит в том, что люди рассматривают Models как то, что они хранят в базе данных, а все остальное (Views, ViewModels, Services и т. Д.) Как приложение. Это большой недостаток. Если вы не читали Домен-управляемый дизайн Я настоятельно рекомендую его, так как он подробно объясняет ценность хорошего Models.

Вот несколько ресурсов:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...