Дублируют ли валидаторы бизнес-логику? - PullRequest
3 голосов
/ 25 июня 2009

Я знаю, что можно использовать валидаторы для проверки ввода данных на уровне представления приложения (например, регулярное выражение, обязательные поля и т. Д.), А также для отображения сообщения и / или требуемого значка маркера. Проверка данных обычно относится к бизнес-уровню. Как избежать необходимости поддерживать два набора проверок данных, которые я собираю?

РЕДАКТИРОВАТЬ: Я знаю, что проверка презентации хороша, и что она информирует пользователя, и что это не безошибочно. Остаётся ли факт, что я эффективно проверяю одно и то же в двух местах?

Ответы [ 4 ]

5 голосов
/ 25 июня 2009

Да, и нет.

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

Проверка в пользовательском интерфейсе предназначена для обеспечения немедленной обратной связи с конечным пользователем системы, чтобы предотвратить выполнение функций на более низких уровнях в первую очередь с недопустимыми входами. Например, вы даже не захотите пытаться связаться с сервером Active Directory без имени пользователя и пароля для попытки аутентификации. Валидация в этот момент экономит ваше время, затрачиваемое на создание экземпляра объекта, его настройку и ненужную обратную передачу на сервер, чтобы узнать что-то, что вы могли бы легко узнать с помощью простой проверки данных.

Проверка в ваших библиотеках классов - это другая история. Здесь вы проверяете бизнес-правила . Хотя можно утверждать, что валидация в пользовательском интерфейсе и валидация в библиотеках классов совпадают, я бы не согласился. Проверка бизнес-правил, как правило, гораздо сложнее. Ваши правила в этом случае могут быть более нюансированными и могут обнаруживать вещи, которые невозможно найти через пользовательский интерфейс. Например, вы можете применить правило, которое гласит, что пользователь может выполнять метод только после того, как все свойства класса были правильно инициализированы, и только если пользователь является членом определенной группы пользователей. Или вы можете указать, что объект может быть изменен, только если он не был изменен в течение последних двадцати четырех часов. Или вы можете просто указать, что строковое значение не может быть нулевым или пустым.

Однако, на мой взгляд, правильно спроектированное программное обеспечение использует общий механизм для принудительного использования DRY (если возможно) как из пользовательского интерфейса, так и из библиотеки классов. В большинстве случаев это возможно. (Во многих случаях код настолько тривиален, что это того не стоит.)

4 голосов
/ 25 июня 2009

Я не думаю, что проверка на стороне клиента (на уровне представления) является актуальной, полезной проверкой; скорее он просто уведомляет пользователя о любых ошибках, которые обнаружит проверка на стороне сервера (бизнес-уровень). Я думаю о нем как о компоненте пользовательского интерфейса, а не как о реальной утилите проверки, и поэтому я не думаю, что и то и другое нарушает DRY.

РЕДАКТИРОВАТЬ: Да, вы делаете то же самое действие, но по совершенно другим причинам. Если ваша единственная цель - строгое соблюдение СУХОГО, тогда вы не хотите делать то и другое. Однако, выполнив оба действия, в то время как вы можете выполнять одно и то же действие, результаты этого действия используются для разных целей (фактически проверка информации по сравнению с уведомлением пользователя о проблеме), и, следовательно, выполнение одного и того же действия дважды фактически приводит в полезной информации каждый раз.

0 голосов
/ 25 июня 2009

Каждый уровень проверки служит для разных целей. Проверка пользовательского интерфейса используется для отбрасывания неверного ввода. Проверка бизнес-логики используется для выполнения проверки на основе бизнес-правил.

Для проверки пользовательского интерфейса вы можете использовать RequiredFieldValidators и другие средства проверки, доступные в платформе ASP.NET. Для проверки бизнеса вы можете создать механизм проверки, который проверяет объект. Это может быть достигнуто с помощью пользовательских атрибутов.

Вот статья, которая объясняет, как создать структуру проверки с использованием пользовательских атрибутов:

http://highoncoding.com/Articles/424_Creating_a_Domain_Object_Validation_Framework.aspx

0 голосов
/ 25 июня 2009

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

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

...