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

Ответ

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

Пример с HTTP-методами:

  • GET – идемпотентный (повторные запросы не изменяют состояние сервера)
  • PUT – идемпотентный (обновление ресурса на один и тот же id даёт одинаковый результат)
  • POST – неидемпотентный (каждый вызов создаёт новый ресурс)

Пример кода:

// Идемпотентная функция
function updateUserName(userId, newName) {
  // Всегда устанавливает одно и то же имя для userId
  return db.update({ id: userId, name: newName });
}

// Неидемпотентная функция
function createUser(name) {
  // Каждый вызов создаёт нового пользователя
  return db.insert({ name });
}

Ответ 18+ 🔞

Да ты послушай, что за термин такой — идемпотентность! Звучит, будто какая-то болезнь, а на деле простая хуйня. Объясняю на пальцах, чтоб даже мартышлюшка поняла.

Представь, ты нажимаешь кнопку «Сохранить» в документе. Раз нажал — сохранил. Второй раз нажал — опять сохранил, но документ-то уже сохранён, ёпта! Он не превратился в два документа, не сгорел, не полетел нахуй в облака. Он просто остался тем же самым сохранённым документом. Вот это и есть идемпотентность, блядь! Сделал операцию один раз или сто раз — итоговый результат, сука, одинаковый, как будто ты её один раз и сделал. Побочных эффектов — ноль ебать.

Вот смотри, как это в интернетах работает:

  • GET – идемпотентный, как валенок. Сколько ни запрашивай одну и ту же страницу, сервер тебе её отдаёт, а сам не меняется. Не начинает вдруг рассылать спам от твоего имени.
  • PUT – тоже идемпотентный мужик. Сказал: «Обнови ресурс с ID=5, чтоб имя было "Вася"». Отправил запрос — обновилось. Отправил его же ещё десять раз — и что? Имя всё равно "Вася", а не "Вася-Вася-Вася-Вася-Вася-Вася-Вася-Вася-Вася-Вася". Пиздец логично.
  • POST – а вот это уже неидемпотентный пидарас! Каждый раз, как его вызываешь, он создаёт новую сущность. Нажал «Создать заказ» — заказ №1. Нажал ещё раз — заказ №2. И так до овердохуища заказов. Вот где волнение ебать начинается, если невнимательно тыкать.

Ну и код, для полного просветления:

// Идемпотентная функция — как тот самый PUT
function updateUserName(userId, newName) {
  // Всё, что она делает — ставит одно и то же имя для одного и того же юзера. Хоть тысячу раз её гоняй.
  return db.update({ id: userId, name: newName });
}

// Неидемпотентная функция — чистой воды POST
function createUser(name) {
  // А эта, сука, каждый раз нового пользователя лепит. Вызвал — один чувак в базе. Вызвал снова — уже два чувака. Идиотская плодовитость!
  return db.insert({ name });
}

Короче, запомни: если после повторения ничего не взорвалось и не размножилось — это идемпотентность. А если от каждого твоего клика у оператора в дата-центре дергается глаз — это пиздец, и надо переделывать.