IDataErrorInfo vs ValidationRule vs Exception

Может ли кто-нибудь сказать мне, что лучше подходит для проверки в WPF.

  • Реализация IDataErrorInfo
  • Создание ValidationRule
  • Выбрасывание исключений

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

Ответы

Ответ 1

Это своего рода сложный запрос, и, честно говоря, он, вероятно, будет отличаться в зависимости от предпочтений больше, чем что-либо еще. Но, здесь мое понимание:

  • Производительность. Исключения будут терять почти каждый раз, если ваши другие реализации не будут ужасающими. Там существенные накладные расходы на цикл броска/вылова. (Анекдот: у меня была проверка "должно быть число", которая была исключением, она "отставала" от пользовательского интерфейса в течение заметного времени, когда она потерпела неудачу, но когда она была преобразована в ValidationRule, это было эффективно мгновенно.)
  • Утечка памяти. Это зависит от того, как выполняются ваши правила проверки или реализации IDataErrorInfo.
  • Модификация кода, повторное использование. Это, конечно, интересная часть. То, что вы действительно должны спрашивать, "когда целесообразно использовать ValidationRule вместо IDataErrorInfo или наоборот?"

ValidationRules старше, чем IDataErrorInfo (я считаю, что последний был введен в .Net 3.5). Исходя из этого, казалось бы, команда WPF предпочитает IDataErrorInfo. Но правда в том, что они созданы для разных вещей. Если у вас MVVM или эквивалентный шаблон, IDataErrorInfo превосходит ошибки в модели (например, отрицательный возраст), тогда как ValidationRules превосходят ошибки в представлении (например, возраст ☃). Конечно, возможно, чтобы проверки ValidationRules выполняли проверки "бизнес-логики" или чтобы IDataErrorInfo сообщал вам, что "снеговик с юникодом не является допустимым возрастом", но вы, вероятно, получите лучшую ремонтопригодность, придерживаясь этого шаблона.

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

Ответ 2

Не рекомендуется использовать исключение для обработки ошибок. Использование исключения уменьшит производительность. Это вопрос выбора и реализации IDataErrorInfo или создания ValidationRule.

IDataErrorInfo

  • Валидация логики держится в модели и легко реализуется и поддерживается
  • Полный контроль над всеми полями в viewmodel

Правило проверки

  • Поддерживает правило проверки в отдельном классе
  • Увеличить повторное использование. Например, вы можете реализовать требуемое поле класс проверки повторно использует его во всем приложении.

Мое мнение заключается в том, что для обычной проверки, например, для проверки правильности поля, для проверки правильности адреса электронной почты вы можете использовать правило проверки. Если вам нужно выполнить выборочные проверки, например, проверку диапазона, или любую другую специальную проверку, используйте IDataerrorinfo.