2010-08-21 2 views
1

Я часто вижу людей, проверяющих объекты домена, создавая объекты правил, которые принимают делегат для выполнения проверки. Такие как в этом примере ": http://www.codeproject.com/KB/cs/DelegateBusinessObjects.aspxКак проверить на уровне домена

То, что я не понимаю, как это выгодно сказать просто сделать метод

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

Но разве это не то же самое, просто имея что-то вроде:.

Bool validate() 
{ 
    Result = string.IsNullOrEmpty(name); 
} 

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

ответ

1

Есть несколько причин:

SRP - Single Ответственность Принцип. Объект не должен нести ответственность за свою собственную проверку, у него есть своя собственная ответственность и основания.

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

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

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

1

Очевидным примером здесь является webapp: вы заполняете форму и нажимаете «отправить». Некоторые из ваших данных ошибочны. Что происходит?

  • Что-то вызывает исключение. Что-то (возможно, выше) выхватывает исключение и печатает его (возможно, вы только поймаете UserInputInvalidExceptions, исходя из предположения, что другие исключения должны быть только зарегистрированы). Вы видите первое, что было не так.
  • Вы пишете функцию validate(). В нем говорится «нет». Что вы показываете пользователю?
  • Вы пишете функцию validate(), которая возвращает (или выбрасывает исключение или добавляет) список сообщений. Вы показываете сообщения ... но разве было бы неплохо группироваться по полю? Или показать его рядом с полем, которое было неправильным? Используете ли вы список кортежей или кортеж списков? Сколько строк вы хотите, чтобы правило занимало?

Инкапсуляция правил в объект позволяет легко перебирать правила и возвращать нарушенные правила. Для каждого правила вам не нужно писать код приложения append-message-to-list. Вы можете придерживаться нарушенных правил рядом с полем, разбившим их.