Найти в Дзене

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

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

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

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

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

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

- Сохранность данных — исключаем дубли и неконсистентность

- Прогнозируемость — повторные запросы не приводят к сюрпризам

- Удобство для пользователя. Нажал «Загрузить» по ошибке — всё равно получишь тот же результат

Например, импорт контрагентов из Excel. Типичный алгоритм:

1. Читаем файл построчно

2. Формируем объект «контрагент» с его реквизитами

3. Сохраняем в базу

4. Пишем запись в журнал импорта

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

- Дубли контрагентов.

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

- Раздувается журнал регистрации.

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

Идемпотентность при обновлениях

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

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

Идемпотентность в интерфейсе

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

При этом решение блокировать кнопку формирования отчета не всегда корректно.

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

То есть может быть два случая когда пользователь нажал на кнопку повторно:

1. Данные не поменялись. Программа позволяет это сделать, но выполняется первое задание

2. Данные поменялись. Программа позволяет это сделать и запускается новое задание

Итог

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