Предположим, что у нас есть приложение, хранящее и показывающие публикации. Публикации создают зарегистрированные пользователи. Просматривать публикации могут также и гости.
Неважно какие технологии использует приложение. Важно только то, что приложение использует базу данных и имеет возможность показывать формы, списки, текст.
У публикации есть поля:
- заголовок
- описание
- содержание
- дата публикации
Я сломал себе голову тем, как реализовывать валидацию.
Пример с публикациями очень простой, но показательный. Вместо публикации может быть карточка пациента, счет на оплату, маршрут перевозки груза и т.п.
Сразу требовать, чтобы все поля были заполненными.
Я предполагаю, что это приведет к тому, что пользователи будут писать статьи в отдельном редакторе и, при готовности, заполнять форму.
Если пользователь указал Дату Публикации, то все поля становятся обязательными для заполнения и должны содержать хотя бы один символ.
Добавляется поле Состояние. Его допустимые значения: Черновик, Опубликовано. Если Состояние переведено в Опубликовано, то все поля обязательны для заполнения.
Приложение относит публикацию к опубликованным на основании ее атрибутов. Если есть текст в текстовых полях и заполнена Дата Публикации, то можно показывать такую публикацию гостям.
Здесь не нужно думать про реализацию и оптимизацию. Например, при сохранении можно узнать удовлетворяет ли публикация требованиям и выставить в БД соответствующий флаг.
2 кнопки "В черновики", "Опубликовать". И добавляется поле "Состояние".
- Как определить категорию публикации? Под категорией тут понимается Опубликована/Черновик. Нужно ли явно клеить ярлык (варианты 2, 3) или вычислять категорию (вариант 4)?
- Как спроектировать форму? Если пользователь не ввел данные полностью, нужно ли прерывать его работу и безальтернативно требовать ввода всех данных? Если использовать вариант 4, то как пользователь узнает какие поля нужно заполнить для публикации?
Предположим, что можно публикацию отправить в Спорт-лото, чтобы это ни значило. Для отправки в Спорт-лото обязательно отсутствует Дата Публикации и заполнены все остальные поля.
У нас появляется поле "Состояние". В одном месте описываются:
- переходы между состояниями
- требования к полям в каждом состоянии
Сценарий.
Публикация опубликована, т.е.
- статус - опубликован
- поля заполнены
Мы отправляем ее в спорт-лото.
Пользователь видит сообщение, что дата публикации должна быть пустая.
удаляем дату, состояние выставляем в отправлено в спорт-лото.
У нас нет централизованного описания состояний и требований к полям. Каждая операция сама должна описывать требования к публикации, что бы быть исполненной.
У нас нет полей, показывающие состояния. Вместо этого есть предикаты. Публикация опубликована тогда, когда заполнены все поля. Публикация в спорт-лото тогда, когда заполнены все поля и отсутствует дата публикации.
Если бы мы имели флаги, то возникает проблема рассинхронизации.
- публикация была опубликована
- выставлен флаг
- публикацию отправили в спорт лото, и удалили дату публикацию
- т.к. это другая операция, и централизованного описания нет, то флаг снять забыли
- как результат публикация опубликована без даты
Еще возникает проблема с тем, что сущность может внезапно оказаться опубликованной. Допустим есть операция редактирования, которая ничего не проверяет. Можно написать чепухи в поля, установить дату и получть опубликованную публикацию.
Или заводить флаг "Была опубликована, но не факт, что сейчас" в включать ее проверки предиката. Но применительно к публикациям это вариант не подходит. Либо не указывать Дату Публикации.
Либо, операция "Опубликовать" должна создать снимок публикации для отображения. При этом изменения публикации не меняют этот снимок.
Есть ли какие-то примеры где хорош второй вариант?
Есть ли какие-то примеры contextual validation?