Что такое идемпотентность?

Идемпотентность — свойство операции, при котором повторный вызов с теми же входными данными не меняет её результат. Проще говоря: можно нажать кнопку «ещё раз» — и ничего не сломается.

Пример из жизни: Кнопка вызова лифта. Если лифт уже вызван, то повторное нажатие не приведет к вызову нового лифта.

Зачем это нужно в разработке?

  • Сохранность данных — исключаем дубли и неконсистентность
  • Прогнозируемость — повторные запросы не приводят к сюрпризам
  • Удобство для пользователя. Нажал «Загрузить» по ошибке — всё равно получишь тот же результат

Например, импорт контрагентов из Excel. Типичный алгоритм: 1. Читаем файл построчно 2. Формируем объект «контрагент» с его реквизитами 3. Сохраняем в базу 4. Пишем запись в журнал импорта

Что идёт не так?

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

  • Раздувается журнал регистрации. Даже если данные не поменялись, мы каждый раз добавляем новую запись в журнал.

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

Не нужно допускать случаев когда мы при обработке изменяем свойство на противоположное (плохо: Объект.ПометкаНаУдаление = Не Объект.ПометкаНаУдаление)

Идемпотентность в интерфейсе Когда пользователь жмёт «Загрузить» или «Сформировать отчёт», не стоит запускать операцию заново — нужно дождаться завершения первого запроса и показать результат.

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

То есть может быть два случая когда пользователь нажал на кнопку повторно: 1. Данные не поменялись. Программа позволяет это сделать, но выполняется первое задание 2. Данные поменялись. Программа позволяет это сделать и запускается новое задание

Итог Идемпотентность помогает писать надёжный код и делать интерфейсы более дружелюбными. Если можно нажать «ещё раз» — пусть это не приведёт к катастрофе.