Что такое идемпотентность?
Идемпотентность — свойство операции, при котором повторный вызов с теми же входными данными не меняет её результат. Проще говоря: можно нажать кнопку «ещё раз» — и ничего не сломается.
Пример из жизни: Кнопка вызова лифта. Если лифт уже вызван, то повторное нажатие не приведет к вызову нового лифта.
Зачем это нужно в разработке?
- Сохранность данных — исключаем дубли и неконсистентность
- Прогнозируемость — повторные запросы не приводят к сюрпризам
- Удобство для пользователя. Нажал «Загрузить» по ошибке — всё равно получишь тот же результат
Например, импорт контрагентов из Excel. Типичный алгоритм: 1. Читаем файл построчно 2. Формируем объект «контрагент» с его реквизитами 3. Сохраняем в базу 4. Пишем запись в журнал импорта
Что идёт не так?
-
Дубли контрагентов. При параллельном или повторном импорте одни и те же строки могут создать две разные записи. Обратите внимание, что и проверки на существующего контрагента могут быть не точные. Например, если искать по наименованию или другим полям, которые может изменить пользователь.
-
Раздувается журнал регистрации. Даже если данные не поменялись, мы каждый раз добавляем новую запись в журнал.
Идемпотентность при обновлениях В разработке конфигураций важно для обработчиков обновления предусмотреть, что они могут выполниться несколько раз.
Не нужно допускать случаев когда мы при обработке изменяем свойство на противоположное (плохо: Объект.ПометкаНаУдаление = Не Объект.ПометкаНаУдаление)
Идемпотентность в интерфейсе Когда пользователь жмёт «Загрузить» или «Сформировать отчёт», не стоит запускать операцию заново — нужно дождаться завершения первого запроса и показать результат.
При этом решение блокировать кнопку формирования отчета не всегда корректно. Например, пользователь может заметить, что указал не ту организацию и следует заново сформировать отчет. В этом случае правильно будет отменить старое задание и запустить новое, а не дожидаться выполнения.
То есть может быть два случая когда пользователь нажал на кнопку повторно: 1. Данные не поменялись. Программа позволяет это сделать, но выполняется первое задание 2. Данные поменялись. Программа позволяет это сделать и запускается новое задание
Итог Идемпотентность помогает писать надёжный код и делать интерфейсы более дружелюбными. Если можно нажать «ещё раз» — пусть это не приведёт к катастрофе.