Re # 1 - Да (это правильный подход) при условии, что объект домена лучше всего «знать», каков правильный ввод.
Re # 2 - Да.
Re # 3 - Тем не менее, не причиняя вреда, если вы не доверяете чему-то внешнему по отношению к классу, чтобы быть способным / ответственным за фактическую проверку, почему вы тогда доверяете ему вызывать проверку?
Я бы проверил валидацию, когда значения установлены, когда у вас есть «хорошие данные» в объекте, нет необходимости проверять их позже.Это приводит к пункту № 4 ...
Re # 4 - бонус в том, чтобы как-то предоставлять / показывать подтверждение, состоит в том, что другие части системы могут использовать его;классический пример - это пользовательский интерфейс, где вы можете обеспечить лучший пользовательский опыт, проверяя ввод при его вводе или отправке.
Другой подход к проверке заключается в определении того, как выглядят хорошие данные (в общем виде) -и определите набор правил для этого, которые существуют как (отдельная) общая служба уровня домена.Проверка входных данных внутри каждого объекта домена хороша, так как вы можете изменять определенные правила по мере того, как отдельные объекты домена созревают со временем (вы ограничиваете влияние отдельных изменений) - недостатком является то, что вы будете повторять много правил.
Обычная служба исправит это, служба скажет: «Вот так выглядит действительный адрес электронной почты» - любые объекты вашего домена будут обращаться к службе, чтобы сообщить им, что такое хороший адрес электронной почты.
«Уловка» в этом подходе состоит в том, чтобы быть осторожным в том, как вы называете методы валидации, - не будьте слишком расплывчатыми или двусмысленными.Например, вы можете найти случаи, когда большинство объектов вашего домена, которые имеют свойство электронной почты, используют один «основной» метод проверки электронной почты ValidateGenericEmail()
, но вы часто будете иметь случаи, когда другие объекты представляют собой особые случаи со специальными правилами ValidateCorporateEmail()
.Это нормально, добавьте их в службу проверки, потому что это центральное место на уровне домена для управления этими правилами.
Ваш доменный объект может тогда делать все, что вам нужно было сделать раньше - за исключением того, что вы вытащили правила в отдельное общее место.