Skip to content

Instantly share code, notes, and snippets.

@darkleaf
Last active January 6, 2019 18:05
Show Gist options
  • Save darkleaf/fc77f851eb77c5b6cb01df342967a6fa to your computer and use it in GitHub Desktop.
Save darkleaf/fc77f851eb77c5b6cb01df342967a6fa to your computer and use it in GitHub Desktop.
validation

Предположим, что у нас есть приложение, хранящее и показывающие публикации. Публикации создают зарегистрированные пользователи. Просматривать публикации могут также и гости.

Неважно какие технологии использует приложение. Важно только то, что приложение использует базу данных и имеет возможность показывать формы, списки, текст.

У публикации есть поля:

  • заголовок
  • описание
  • содержание
  • дата публикации

Я сломал себе голову тем, как реализовывать валидацию.

Пример с публикациями очень простой, но показательный. Вместо публикации может быть карточка пациента, счет на оплату, маршрут перевозки груза и т.п.

Вариант 1

Сразу требовать, чтобы все поля были заполненными.

Я предполагаю, что это приведет к тому, что пользователи будут писать статьи в отдельном редакторе и, при готовности, заполнять форму.

Вариант 2

Если пользователь указал Дату Публикации, то все поля становятся обязательными для заполнения и должны содержать хотя бы один символ.

Вариант 3

Добавляется поле Состояние. Его допустимые значения: Черновик, Опубликовано. Если Состояние переведено в Опубликовано, то все поля обязательны для заполнения.

Вариант 4

Приложение относит публикацию к опубликованным на основании ее атрибутов. Если есть текст в текстовых полях и заполнена Дата Публикации, то можно показывать такую публикацию гостям.

Здесь не нужно думать про реализацию и оптимизацию. Например, при сохранении можно узнать удовлетворяет ли публикация требованиям и выставить в БД соответствующий флаг.

Вариант 5

2 кнопки "В черновики", "Опубликовать". И добавляется поле "Состояние".

Вопросы

  1. Как определить категорию публикации? Под категорией тут понимается Опубликована/Черновик. Нужно ли явно клеить ярлык (варианты 2, 3) или вычислять категорию (вариант 4)?
  2. Как спроектировать форму? Если пользователь не ввел данные полностью, нужно ли прерывать его работу и безальтернативно требовать ввода всех данных? Если использовать вариант 4, то как пользователь узнает какие поля нужно заполнить для публикации?

Расширение задачи

Предположим, что можно публикацию отправить в Спорт-лото, чтобы это ни значило. Для отправки в Спорт-лото обязательно отсутствует Дата Публикации и заполнены все остальные поля.

Вариант 1

У нас появляется поле "Состояние". В одном месте описываются:

  • переходы между состояниями
  • требования к полям в каждом состоянии

Сценарий.

Публикация опубликована, т.е.

  • статус - опубликован
  • поля заполнены

Мы отправляем ее в спорт-лото.

Пользователь видит сообщение, что дата публикации должна быть пустая.

удаляем дату, состояние выставляем в отправлено в спорт-лото.

Вариант 2

У нас нет централизованного описания состояний и требований к полям. Каждая операция сама должна описывать требования к публикации, что бы быть исполненной.

У нас нет полей, показывающие состояния. Вместо этого есть предикаты. Публикация опубликована тогда, когда заполнены все поля. Публикация в спорт-лото тогда, когда заполнены все поля и отсутствует дата публикации.

Если бы мы имели флаги, то возникает проблема рассинхронизации.

  • публикация была опубликована
  • выставлен флаг
  • публикацию отправили в спорт лото, и удалили дату публикацию
  • т.к. это другая операция, и централизованного описания нет, то флаг снять забыли
  • как результат публикация опубликована без даты

Еще возникает проблема с тем, что сущность может внезапно оказаться опубликованной. Допустим есть операция редактирования, которая ничего не проверяет. Можно написать чепухи в поля, установить дату и получть опубликованную публикацию.

Или заводить флаг "Была опубликована, но не факт, что сейчас" в включать ее проверки предиката. Но применительно к публикациям это вариант не подходит. Либо не указывать Дату Публикации.

Либо, операция "Опубликовать" должна создать снимок публикации для отображения. При этом изменения публикации не меняют этот снимок.

Вопрос

Есть ли какие-то примеры где хорош второй вариант?

Есть ли какие-то примеры contextual validation?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment