Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Лапшекодим валидацию, или запрещаем вводить неправильные данные?

06.06.22 22:11
Re: Лапшекодим валидацию, или запрещаем вводить неправильные данные?
 
alex445 коренной житель
в ответ AlexNek 06.06.22 21:47, Последний раз изменено 06.06.22 22:19 (alex445)

Вы, похоже, не понимаете, что я имею ввиду. Все ваши примеры - это валидация на стороне вью модели. А атрибуты обычно устанавливают для модели. По всем вашим ссылкам авторы пишут MVVM, но модель куда-то у них подевалась.


Вот классическая статья от одного из первых авторов по WPF и MVVM, и в этой идее валидации изначально была реализация IDataErrorInfo в обоих слоях (модель и вью модель), при этом на каждом своя валидация. Обратите внимание на объект _person там - это переменная для хранения модели во воью модели. При присваивании свойству Age вью модели значения, сначала проходит валидация вью модели, затем идёт присвоение свойства модели, и там происходит своя валидация. По вашим ссылкам авторы всё упростили и извратили, забыв про модель - а нафига она им вообще нужна тогда? Ваши авторы фигачат атрибуты прямо для вью модели и называют это MVVM. С таких подходом им не нужна модель. Ну или роль модели у них выполняет вью модель. Так тоже можно, но это не MVVM. А они просто засоряют мозги неадекватными названиями себе и другим.


Для такой валидации как в ваших статьях, вам нужно кинуть ссылку на модель в базовый класс вью модели, где у вас реализован интерфейс IDataErrorInfo и где проходит валидация. А так как модель может быть любым типом, надо делать базовый класс дженериком, и чтобы параметр типа этого дженерика реализовывал какой-то валидирующий интерфейс, и это будет не IDataErrorInfo, а что-то с методом Validate - чтобы чтобы однообразно вызывать валидацию модели для любого типа модели. Без базового класса вы будете писать портянки валидации для каждого класса отдельно. В результате что в ваших примерах, только реальных, а не висящих в воздухе, что в подходе Джоша Смита - куча лапшы, переусложнённые модели (и вью модели) с параметрами типов. А в ваших примерах, в отличие от Джоша Смита, ещё и рефлексия вовсю дёргается.


А в моём подходе вы всё храните в свойствах, пробрасываете свойства модели во вью модель сразу, без преобразований, вам не нужен никакой интерфейс, вам не нужна базовая модель с валидацией, вы не испольузете дженерики, а вы сразу привязываете свойства и их ограничения к правильным контролам. И даже если вы не используете MVVM по факту, а всё делаете в одной модели, то хранить все ограничения в свойствах тоже лучше, чем в атрибутах.


Где-то надо использовать и атрибуты, но явно не в формошлёпстве с вышеописанными переусложнениями. IDataErrorInfo - это усторевший в формошлёпстве многословный интерфейс, как и всякие портянки валидирующих правил в разметке. Можно обойтись и без всего этого, если применять правильные инструменты.

 

Перейти на