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