Я хотел бы спросить ваши идеи о разработке наилучшего подхода к валидации для следующих требований:
У нас есть User
класс модели, и в зависимости от его статуса мы можем обновить некоторые конкретные поля. Как видите, изменчивость класса модели зависит от его поля состояния.
- Если статус пользователя
ACTIVE
, то все поля (имя, фамилия,
пароль ....) можно обновить.
- Если статус пользователя
INACTIVE
, то только пароль может быть обновлен.
- Если статус пользователя
BLOCKED
, то имя и фамилия могут быть
обновлен.
- Если статус пользователя
DELETED
, то операция обновления не
разрешено для любого поля.
Очевидно, это можно сделать, просто добавив класс UserValidator
, и перед установкой значений в методах установки я могу вызвать UserValidator
, чтобы проверить, разрешена операция или нет. Однако у него есть недостаток (?): Что произойдет, если появится новое поле (скажем, maritalStatus
), и разработчик, который добавляет это поле, забывает вызвать UserValidator
перед установкой maritalStatus
?
Другие способы решения этой проблемы, о которых я могу подумать:
- Использование пользовательских аннотаций путем расширения
CustomValidator
. Тем не менее, это
не будет работать, так как аннотация не может знать предыдущие значения объекта.
Я имею в виду, isValid()
метод CustomValidator
не будет знать, если имя
поле изменилось или нет (это был "Джон", и теперь dev хочет изменить его
«Джеку»)
- Прокси-шаблон может быть полезен, но не уверен, стоит ли его использовать
прокси для модельных объектов.
Я видел, что шаблон декоратора может быть использован для этой проблемы, но я не понимаю, как. Я думаю, что проверка класса модели не входит в обязанности дизайнера декоратора.
public class User {
private Integer id;
private String name;
private String surname;
private String password;
private Status status;
// setters
}
public enum Status {
ACTIVE, DELETED, INACTIVE, BLOCKED
}