У моего коллеги возникла идея, которая сработала довольно хорошо. У нас никогда не было подходящего имени, но мы называли его «Инспектор / Судья».
Инспектор будет смотреть на объект и сообщать вам все правила, которые он нарушил. Судья решит, что с этим делать. Это разделение позволило нам сделать несколько вещей. Это позволило нам разместить все правила в одном месте (инспектор), но мы могли бы иметь несколько судей и выбирать судью по контексту.
Один из примеров использования нескольких судей вращается вокруг правила, согласно которому Клиент должен иметь адрес. Это было стандартное трехуровневое приложение. На уровне пользовательского интерфейса судья должен производить что-то, что пользовательский интерфейс может использовать для указания полей, которые должны быть заполнены. Судья пользовательского интерфейса не выбрасывает исключения. На уровне обслуживания был еще один судья. Если во время сохранения он найдет клиента без адреса, он выдаст исключение. В этот момент вы действительно должны остановить процесс.
У нас также были Судьи, которые были более строгими, так как состояние объектов менялось. Это была заявка на страхование, и в процессе цитирования полису разрешалось сохранять в неполном состоянии. Но как только эта Политика была готова к тому, чтобы стать Активной, многое нужно было установить. Таким образом, судья-заявитель со стороны службы был не так строг, как судья-активатор. Тем не менее, правила, используемые в Инспекторе, были все те же, так что вы все равно могли сказать, что было неполным, даже если вы решили ничего с этим не делать.