Когда у меня есть много данных, которые необходимо проверить, я должен создать новый класс с единственной целью проверки или я должен придерживаться проверки в методе?
Мой конкретный пример рассматривает турнир и класс события / категории: Tournament
и Event
, который моделирует спортивный турнир, и у каждого турнира есть одна или несколько категорий.
В этих классах есть все, что нужно проверить: игроки должны быть пустыми, должны быть уникальными, количество матчей, которые должен сыграть каждый игрок, количество игроков в каждом матче, предопределенные матчи и действительно большой набор вещей, включающий в себя гораздо больше сложные правила.
Есть также некоторые части, которые мне нужно проверить в целом, например, как классы интегрируются друг с другом. Например, унитарная проверка Player
может быть вполне приемлемой, но если в событии дважды участвует один и тот же игрок, это ошибка проверки.
Так как насчет этого ?: Я забыл об абсолютно любой предварительной проверке при использовании сеттеров классов моей модели и подобных методов для добавления данных, и вместо этого я позволил классам проверки обрабатывать это.
Таким образом , мы будем иметь что - то вроде EventValidator
с Event
членом, и validate()
метод , который проверяет весь объект, а также особые методы проверки правил всех членов.
Затем, прежде чем создавать экземпляр допустимого объекта, я выполню проверку, чтобы предотвратить недопустимые значения.
Мой дизайн правильный? Должен ли я сделать что-то по-другому?
Кроме того, я должен использовать методы проверки логического возврата? Или просто выбросить исключение, если проверка не удалась? Мне кажется, что лучшим вариантом было бы возвращение логических методов и выдача исключения, когда объект создается, например:
public Event() {
EventValidator eventValidator = new EventValidator(this);
if (!eventValidator.validate()) {
// show error messages with methods defined in the validator
throw new Exception(); // what type of exception would be best? should I create custom ones?
}
}
источник
Validator
или вValidable
? И как я могу работать с этими сообщениями в сочетании сValidationException
?Validatable
что это имя намного лучше, чемValidable
настоящее прилагательноеЭто проблема. В идеале вы должны предотвратить недопустимое состояние ваших объектов: не допускайте создания экземпляров с недопустимым состоянием, и если у вас должны быть сеттеры и другие методы изменения состояния, выведите исключение прямо здесь.
Это не противоречиво. Если логика проверки достаточно сложна, чтобы гарантировать собственный класс, вы все равно можете делегировать проверку. И если я вас правильно понял, это именно то, что вы делаете сейчас:
Если у вас все еще есть сеттеры, которые могут привести к недопустимому состоянию, убедитесь, что вы проверили его перед фактическим изменением состояния. В противном случае вы получите сообщение об ошибке, но все равно оставите свой объект с недопустимым состоянием. Опять же: предотвратите недопустимое состояние ваших объектов
Звучит хорошо для меня, так как валидатор ожидает допустимый или недействительный ввод, поэтому с его точки зрения недопустимый ввод не является исключением.
Обновление: если «система в целом» становится недействительной, причина в том, что какой-то объект должен был измениться (например, игрок), а некоторые объекты более высокого уровня (например, событие), которые ссылаются на этот объект, имеют условие, которое больше не выполняется , Теперь решение состоит в том, чтобы не допустить прямых изменений в игроке, которые могут сделать что-то недействительным на более высоком уровне. Здесь помогают неизменные объекты . Тогда измененный игрок - это другой объект. Как только игрок связан с событием, вы можете изменить его только из самого события (потому что вам придется изменить ссылку на новый объект) и снова подтвердить его немедленно.
источник