Ідемпотентні методи — це такі методи або операції в програмуванні, які при повторному виконанні з тими ж вхідними даними дають той самий результат, що й при першому виконанні, без додаткових побічних ефектів. Тобто, незалежно від кількості разів, коли виконується метод, його вплив на систему залишається незмінним.
Що означає ідемпотентний?
Слово "ідемпотентний" походить від латинських слів "idem" та "potens".
-
"Idem" означає "той самий".
-
"Potens" означає "сильний" або "спроможний".
Термін можна трактувати як "спроможний зберігати те саме" або "той, що залишається незмінним при повторному застосуванні".
Термін вперше був використаний в математиці, де він описував операцію, яка при застосуванні до будь-якого елемента множини дає той самий результат, що й первісний елемент. Згодом поняття було перенесене в інші галузі, такі як програмування, де ідемпотентність означає, що результат операції не змінюється при повторному виконанні.
Приклади ідемпотентних методів
Ідемпотентність проявляється в багатьох контекстах програмування та роботи з даними. Наприклад, у файловій системі, команда створення директорії, якщо вона вже існує, не змінює її стан при повторному виконанні. Так само видалення файлу, який уже був видалений, не матиме жодного ефекту.
У базах даних ідемпотентними можуть бути запити типу UPDATE, які встановлюють певне значення, наприклад, оновлення статусу користувача на "active". Якщо запит виконати кілька разів з тим самим значенням, стан бази даних не зміниться. Аналогічно, операції типу
DELETE, які видаляють запис, не призводять до жодних змін, якщо запис уже був видалений. Більш детальніше про REST API можна почитати за
посиланням.
Кешування теж може бути ідемпотентним. Взяття значення з кешу, коли воно не змінювалося, завжди повертає один і той самий результат. Встановлення певного значення в кеш, коли воно вже присутнє, не змінює стан кешу.
У контексті
RESTful API методи
PATCH та
HEAD також є прикладами ідемпотентності. Наприклад, оновлення конкретного поля об'єкта, якщо значення вже встановлено, не призведе до зміни стану об'єкта. Запит HEAD, який отримує метадані ресурсу, не впливає на його стан.
У функціональному програмуванні функції, такі як abs(x) або round(x), також ідемпотентні. Вони завжди повертають одне й те саме значення для одного і того ж аргументу, навіть при повторному виклику.
У системах керування конфігурацією, таких як Ansible або Puppet, багато операцій є ідемпотентними. Наприклад, встановлення певного пакета або створення конфігураційного файлу з фіксованим вмістом не змінить стан сервера при повторному виконанні завдання.
Навіть у веб-інтерфейсах ідемпотентність проявляється, наприклад, у кнопці "Like" в соціальних мережах. Якщо користувач вже лайкнув пост і натисне кнопку знову, стан залишиться незмінним. Цей наприклад є найпростішим та найзрозумілішим.