Куда относится этот метод? - PullRequest
4 голосов
/ 21 апреля 2009

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

Когда пользователь вводит адрес в пользовательском интерфейсе, он сериализуется в объект Address. Поэтому мне было интересно: куда относится метод, подобный isComplete? Валидатор или модель?

Если я помещу этот метод в модель адреса и вызову address.isComplete() в валидаторе перед сохранением, это означает, что неполный адрес является допустимым состоянием системы; если я проверяю полноту в валидаторе, создается впечатление, что валидатор слишком много знает о внутренних адресах.

Мне интересно, по какому общему правилу следуют другие?

РЕДАКТИРОВАТЬ: Как упомянуто ниже, в приведенном выше примере объект адреса повторно используется в нескольких системах, и «полный» объект в одной системе может не означать «полный» объект в другой системе. Таким образом, не существует единого способа принудительного применения «Объект никогда не должен создаваться в недопустимом состоянии» в глобальном масштабе, поскольку недопустимое состояние зависит от контекста.

Ответы [ 11 ]

0 голосов
/ 21 апреля 2009

Если вы не хотите, чтобы ваш валидатор знал о том, что он проверяет, вы можете использовать интерфейс или инверсию шаблона управления. Со стороны интерфейса это просто ...

interface IValidateable  // or whatever :)
{
   bool IsValid { get; }
}

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

На стороне IoC это более сложно. Вы бы передали валидатору конкретную сигнатуру метода, которую он будет вызывать для объекта (то есть, чтобы проверить меня, вызовите это). Но это более сложное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...