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