Предотвращение дублирования данных и расчетов в моделях представления - PullRequest
1 голос
/ 26 июля 2011

Я работаю над приложением Flex, которое использует MVVM.Я понимаю, что рекомендуется иметь соотношение 1 к 1 между представлениями и моделями представления.Как тогда избежать выполнения одних и тех же вычислений и сохранения одних и тех же данных несколько раз, если они необходимы в нескольких представлениях?

Например, представьте, что у меня есть программа, которая может загружать файлы проекта, состоящие из списка элементов.На главной вкладке моего приложения есть кнопка экспорта, которая должна быть включена только в том случае, если проект действителен, поэтому я создаю свойство isExportEnabled в модели представления для главной вкладки.Расчет для этого включает проверку проекта путем итерации каждого элемента в проекте и проверки некоторого атрибута каждого элемента.У меня есть еще одна вкладка с кнопкой «Print Project Summary», поэтому модель представления для этой вкладки имеет isPrintEnabled.Значение для этого флага основывается на тех же критериях, независимо от того, является ли проект действительным.

  1. Я мог бы поместить логику для определения этих значений в их соответствующие модели представления, но затемЯ заканчиваю тем, что вычисляю одно и то же значение дважды при загрузке проекта.

  2. Я могу переместить isValid в модель предметной области, но затем модель становится денормализованной.Что если сохраненный проект редактируется без обновления флага «isValid»?

  3. Я мог бы создать глобальную «Project View-Model» для всего проекта, которая рассчитывает, является ли проект действительным, изатем пусть isExportEnabled и isPrintEnabled делегируют это.Однако затем я получаю иерархию моделей представлений, которую эта статья рекомендует избегать: Применение модели представления в Flex

Такое ощущение, что нет правильныхспособ сделать это.

1 Ответ

0 голосов
/ 26 июля 2011

То есть вы говорите, что у вас есть два пользовательских жеста, «Экспорт» и «Сводка проекта печати», которые основаны на одной и той же функции проверки?Если я правильно прочитал ваш пост, вы можете рассчитать его один раз и получить два получателя

private var _isValid:Boolean;
public function validate():Boolean
{
    _isValid = //result of calculation
    dispatchEvent( new Event("isValidChange") )
}
[Bindable(Event="isValidChange")]
public function get canExport():Boolean
{
   return _isValid;
}
[Bindable(Event="isValidChange")]
public function get canPrint():Boolean
{
   return _isValid;
}

Теперь некоторые могут сказать, что, поскольку они возвращают одно и то же значение, мы должны избавиться от получателей и вернуть простоеBindable] общественная ценность.Но так как это похоже на первую реализацию этой функции, наличие двух отдельных функций позволяет вам получить некоторую надежность перед лицом изменения пользовательского интерфейса и требований к валидации.

Лично, если логика валидации становится слишком тяжелой, я бы оставил этозначение в моей модели "public var isValidProject", поскольку модель должна знать, является ли она действительной или нет.Затем уровень представления будет использовать это значение, чтобы определить, как представить пользователю, что это недопустимый проект (всплывающие окна, оповещения, строки ошибок).

В других случаях я бы установил на презентаторе этих кнопок «set selectedProject» и запустил проверку и / или изменил состояние включения моих кнопок.

Мне действительно было бы интересно услышать другие мысли по этому поводу.

...