Що таке ідентична операція?


Відповіді:


964

В обчислювальній роботі ідентична потужність - це операція, яка не має додаткового ефекту, якщо її викликають більше одного разу з тими ж вхідними параметрами. Наприклад, видалення елемента з набору можна вважати операцією, що набуває бездоменної дії.

У математиці ідентифікаційна операція - це операція, де f (f (x)) = f (x) . Наприклад, abs()функція ідентична, тому що abs(abs(x)) = abs(x)для всіх x.

Ці дещо різні визначення можна узгодити, враховуючи, що x в математичному визначенні являє собою стан об'єкта, а f - операція, яка може мутувати цей об'єкт. Наприклад, розглянемо Pythonset та його discardметод. discardМетод видаляє елемент з набору, і нічого не робить , якщо елемент не існує. Тому:

my_set.discard(x)

має точно такий же ефект, як двічі виконувати ту саму операцію:

my_set.discard(x)
my_set.discard(x)

Ідентичні операції часто використовуються при розробці мережевих протоколів, де запит на виконання операції гарантовано відбувається хоча б один раз, але може траплятися і не один раз. Якщо операція безрезультатна, то не буде шкоди виконувати операцію два чи більше разів.

Додаткову інформацію див. У статті Вікіпедії про ідентифікацію .


Наведена відповідь раніше мала кілька невірних та оманливих прикладів. Коментарі, написані до квітня 2014 року, стосуються старішої редакції.


6
Приклад: оскільки відповідь вище стверджує, що Idempotent operations are often used in the design of network protocolsось пов'язаний приклад ** GET не передбачає нічого змінювати на сервері, тому GET є ідентичним. У контексті HTTP / сервлету це означає, що один і той же запит може бути зроблений двічі без негативних наслідків. ** POST НЕ ідентичний.
КНУ

1
Чи є "без громадянства" синонімом "idempotent"?
Михайло Ософський

2
@MichaelOsofsky: Ні, у setприкладі Python у відповіді заданий об'єкт чітко має стан, а також пропонує деякі ідентичні операції, такі як discard.
Грег Хьюгілл

1
@MichaelOsofsky, discardтакож може бути реалізовані таким чином , особи без громадянства, охоплюючи стан в повернутому значенні: discard([my_set, x]) = [my_new_set, x]. Так ви можете зробити discard(discard([my_set, x])). Зауважте, що [my_new_set, x]це лише один аргумент, і його тип є 2-кратним.
Pacerier

2
@ Зелений Якщо використовувати термін той же ефект у контексті імпотенції, це означає, що результат той самий, а не дія . Виклик discard(x)вдруге матиме такий самий ефект, як і виклик першого разу: Набір більше не міститиме x. Обчислювальна імпотенція стосується надійності системи. Оскільки речі можуть вийти з ладу (наприклад, відключення мережі), як виявити несправність, як відновитись? Найпростіше відновлення - це просто зробити це знову, але це працює, лише якщо це зробити знову - безвідмовно. Напр. discard(x), Ідентичний, але pop()ні. Вся справа у відновленні помилок.
Андреас

138

Ідентичну операцію можна повторити довільну кількість разів, і результат буде таким самим, як якщо б це було зроблено лише один раз. У арифметиці додавання нуля до числа є ідентичним.

Про ідентифікацію багато говорять у контексті "RESTful" веб-сервісів. REST прагне максимально використовувати HTTP, щоб надати програмам доступ до веб-контенту, і, як правило, встановлюється на відміну від веб-служб на основі SOAP, які просто тунелюють сервіси віддаленої процедури виклику в межах HTTP-запитів та відповідей.

REST організовує веб-додаток у "ресурси" (наприклад, користувач Twitter або зображення Flickr), а потім використовує HTTP дієслова POST, PUT, GET та DELETE для створення, оновлення, читання та видалення цих ресурсів.

Ідентифікація відіграє важливу роль у REST. Якщо ви отримаєте подання ресурсу REST (наприклад, GET-зображення jpeg від Flickr), і операція не вдасться, ви можете просто повторювати GET знову і знову, поки операція не буде успішною. Для веб-сервісу неважливо, скільки разів ви отримуєте зображення. Крім того, якщо ви використовуєте веб-сервіс RESTful для оновлення інформації свого акаунта Twitter, ви можете вводити нову інформацію стільки разів, скільки потрібно, щоб отримати підтвердження від веб-служби. ПІДКЛЮЧИТИ його в тисячу разів - це те саме, що PUT-ing це один раз. Аналогічно ВИДАЛИТИ РЕСТОВИЙ ресурс у тисячу разів - це те саме, що видалити його раз. Таким чином, Idempotence значно спрощує створення веб-сервісу, стійкого до помилок зв'язку.

Подальше читання: RESTful Web Services Річардсона та Рубі (ідентифікація обговорюється на стор. 103-104) та докторська дисертація Роя Філдінга на REST . Філдінг був одним із авторів HTTP 1.1, RFC-2616, який розповідає про ідентифікацію в розділі 9.1.2 .


Чіткий і прямий. І все-таки це лише одна інтерпретація ідентичного.
Pacerier

10
"idempotence" - це сильно перевантажене слово, оскільки воно звучить великомовно і має достатньо символів, щоб пройти півскіпедальну перевірку. Якби Бенджамін Перс обрав простіше звучання слова, у нас сьогодні навіть не було б цього питання.
Pacerier

2
Як це зрозуміти: Аналогічно ВИДАЛИТИ-ВИКОРИСТАННЯ ресурсу REST в тисячу разів - це те саме, що видалити його один раз ? Ви не можете знову видалити ресурс, якщо він уже видалений.
Зелений

1
@Green, але ви не видаляєте його вперше. Ви надсилаєте запит на видалення . Важливий момент - ви можете надіслати стільки запитів, скільки вам подобається.
Калет

1
@JimFerrans Я бачу. Я подумав, що може бути причина, пов'язана з функціональністю (вбудована в сам HTTP), чому PUT можна не хвилюватися, а POST не може. Тепер виявляється, що від нас просто потрібно відповідати стандартам HTTP і поведінка повністю базується на тому, як реалізовано сервер
mangusta

109

Незалежно від того, скільки разів ви викликаєте операцію, результат буде однаковим.


8
Я чув, що idempotent визначається як один або обидва з наведених нижче: 1) Для заданого набору входів він завжди повертатиме один і той же вихід. 2) Не викликає жодних побічних ефектів. Моє запитання: якщо функція відповідає №1, але не №2, оскільки це призводить до побічного ефекту, не пов’язаного з обчисленням (записує запит у сховище даних, наприклад), чи все-таки вважається ідентичним?
Кіт Беннетт

12
Результат виклику операції повинен включати стан системи, тому якщо операція має якийсь накопичувальний побічний ефект, вона не є ідентичною; однак, якщо побічний ефект залишає систему в тому самому стані, незалежно від того, скільки разів операція не викликається, то вона може бути безсильною.
Роберт

4
Короткий і милий, я люблю таку відповідь. Не впевнений, чому мені доводиться постійно шукати цей термін, він просто не залишається зі мною.
Prancer

1
@KeithBennett, Друге визначення неправильне. "Немає побічних ефектів" не означає безсилля. Імпотентні функції можуть мати побічні ефекти. Наприклад , MySQL це truncateі delete.
Pacerier

Результат буде таким же (тобто стан системи), але відповідь може відрізнятися (тобто коди статусу HTTP на службі REST).
Г. Штейгерт

50

Ідентифікація означає, що застосування операції один раз або застосування декількох разів має однаковий ефект.

Приклади:

  • Множення на нуль. Незалежно від того, скільки разів ви це робите, результат все одно дорівнює нулю.
  • Встановлення булевого прапора. Незалежно від того, скільки разів ви це робите, прапор залишається встановленим.
  • Видалення рядка з бази даних із заданим ідентифікатором. Якщо спробувати ще раз, рядок все одно не залишиться.

Для чистих функцій (функцій, які не мають побічних ефектів), тоді idempotency означає, що f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... для всіх значень х

Для функцій з побічними ефектами idempotency, крім того, означає, що ніяких додаткових побічних ефектів після першого застосування не буде викликано. Ви можете вважати стан світу додатковим «прихованим» параметром функції, якщо вам це подобається.

Зауважте, що у світі, де у вас відбуваються одночасні дії, ви можете виявити, що операції, які ви вважали ідентичними, перестають бути такими (наприклад, інший потік може скасувати значення булевого прапора у наведеному вище прикладі). В основному, коли у вас є паралельність і незмінний стан, вам потрібно набагато ретельніше подумати про ідентифікацію.

Idempotency часто є корисною властивістю для створення надійних систем. Наприклад, якщо є ризик, що ви можете отримати повторне повідомлення від третьої сторони, корисно, щоб обробник повідомлень діяв як ідентична операція, щоб ефект повідомлення відбувся лише один раз.


1
Якщо для чистих функцій f(x) = f(f(x)), ви маєте на увазі, що f(x){return x+1;}це не чиста функція? тому що f(x) != f(f(x)): f(1)дає 2, а f(2)дає 3.
Pacerier

1
@Pacerier Ні, @mikera говорить чисто і ідемпотентна має на увазі f(x) = f(f(x)). Але, як згадував @GregHewgill, для того, щоб це визначення мало сенс, ви повинні розглядати xяк об'єкт і fяк операцію, яка мутує стан об'єкта (тобто: вихід fє мутованим x).
Джастін J Старк

24

Ідемогенна операція видає результат у тому самому стані, навіть якщо ви викликаєте його не один раз, за ​​умови, що ви передаєте ті самі параметри.


1
Це зовсім не звучить логічно. stackoverflow.com/questions/1077412/…
Зелений

2
Я думаю, що ви можете збивати з пантелику безладних і детермінованих .
Suncat2000

16

Просто хотілося викинути справжній випадок використання, який демонструє ідентичність. У JavaScript скажіть, що ви визначаєте купу модельних класів (як у моделі MVC). Те, як це часто реалізується, функціонально еквівалентне чомусь подібному (основний приклад):

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

Потім можна визначити нові класи на зразок цього:

var User = model('user');
var Article = model('article');

Але якби ви намагалися отримати Userклас через model('user'), з іншого місця в коді, це не вдасться:

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

Ці два Userконструктори були б різними. Це є,

model('user') !== model('user');

Щоб зробити його ідентичним , ви просто додасте якийсь механізм кешування, як-от так:

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

Додаючи кешування, кожен раз, коли ви model('user')це робили, він буде одним і тим самим об'єктом, і таким чином він ідентичний. Тому:

model('user') === model('user');

10

Імпотентна операція - це операція, дія чи запит, які можна застосувати кілька разів, не змінюючи результат, тобто стан системи, поза початковою програмою.

ПРИКЛАДИ (КОНТЕКСТ WEB APP):

ІДЕМПОТЕНТ: Оформлення декількох однакових запитів має той самий ефект, що і подання одного запиту. Повідомлення в системі обміну повідомленнями електронної пошти відкривається і позначається як "відкрито" в базі даних. Повідомлення можна відкривати багато разів, але ця повторна дія завжди призведе до того, що це повідомлення перебуває у "відкритому" стані. Це безвідмовна операція. Перший раз, коли PUT вносить оновлення до ресурсу, використовуючи інформацію, яка не відповідає ресурсу (стан системи), стан системи змінюватиметься по мірі оновлення ресурсу. Якщо один PUT один і той же оновлення ресурсу повторно, то інформація в оновлення буде відповідати інформації, яка вже є в системі при кожному PUT, і жодна зміна стану системи не відбудеться. Повторні PUT з однаковою інформацією є ідентичними:

НЕ-ІДЕМПОТЕНТ: Якщо операція завжди спричиняє зміну стану, наприклад, надсилання одного і того ж повідомлення користувачеві знову і знову, в результаті чого щоразу надсилається та зберігається нове повідомлення в базі даних, ми говоримо, що операція НЕ-ІДЕМПОТЕНТ.

NULLIPOTENT: Якщо операція не має побічних ефектів, наприклад, чисто відображення інформації на веб-сторінці без будь-яких змін у базі даних (іншими словами, ви лише читаєте базу даних), ми говоримо, що операція NULLIPOTENT. Усі GET повинні бути недійсними.

Коли ми говоримо про стан системи, ми, очевидно, ігноруємо надію нешкідливі та неминучі ефекти, такі як реєстрація та діагностика.


9

Ідентичні операції: операції, які не мають побічних ефектів, якщо виконуються кілька разів.
Приклад : Операція, яка витягує значення з ресурсу даних і, скажімо, друкує

неідентичні операції: Операції, які можуть заподіяти шкоду, якщо виконуватись кілька разів. (У міру зміни деяких значень або станів)
Приклад: Операція, яка знімає з банківського рахунку


3
Насправді неправильна відповідь! для операції Idempotent сказати "не мають побічних ефектів" невірно. для неімпотентних операцій вислів "заподіяти деяку шкоду" є заплутаною відповіддю.
Саїд Мохташам

9

Досить детальні та технічні відповіді. Просто додайте просте визначення.

Idempotent = Повторно запущений

Наприклад, Createсама по собі операція не гарантується без помилок, якщо виконується більше одного разу. Але якщо є операція, CreateOrUpdateто вона заявляє про повторну експлуатацію (Idempotency).


3
Це оманливе визначення. повторна спроможність не гарантує того, що вона є самовпевненою. Операцію можна повторно виконати, і в кожному запуску вона може додати додаткові ефекти до результату, тому вона не буде ідентичною.
Саїд Мохташам

7

Безпосередня операція над набором залишає його членів незмінними при застосуванні один або кілька разів.

Це може бути одинарна операція, як абсолютна (x), де x належить до множини натуральних чисел. Тут абсолютна (абсолютна (х)) = х.

Це може бути двійкова операція, як об'єднання множини із собою завжди повертає один і той же набір.

ура


Імпотентна операція - це операція, де f (f (x)) = f (x). "залишає своїх членів без змін" - це не правильна відповідь.
Саїд Мохташам

7

Будь-яка операція, коли кожен n-й результат призведе до виходу, що відповідає значенню першого результату. Наприклад, абсолютне значення -1 дорівнює 1. Абсолютне значення абсолютного значення -1 дорівнює 1. Абсолютне значення абсолютного значення абсолютного значення -1 дорівнює 1. І так далі.

Дивіться також: Коли буде справді нерозумно використовувати рекурсію?


1
це жалюгідна відповідь навіть через 10 років. +1
ЗСШ

2

Хорошим прикладом розуміння самодіяльної операції може бути заблокування автомобіля за допомогою дистанційного ключа.

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lock- це безвідмовна операція. Навіть якщо кожен раз, коли ви біжите lock, є якісь побічні ефекти , як моргання, машина все ще знаходиться в тому ж самому заблокованому стані, незалежно від того, скільки разів ви виконуєте роботу блокування.


1

мій 5в: В інтеграції та налагодженні мереж ідентифікація дуже важлива. Кілька прикладів із реального життя: Уявіть, ми доставляємо дані до цільової системи. Дані, доставлені послідовністю повідомлень. 1. Що буде, якщо послідовність буде змішана в каналі? (Як завжди роблять мережеві пакети :)). Якщо цільова система ідентична, результат не буде іншим. Якщо цільова система залежить від правильного порядку в послідовності, нам доведеться впровадити реквенсер на цільовому сайті, який би відновив правильний порядок. 2. Що буде, якщо є дублікати повідомлень? Якщо канал цільової системи не розпізнає своєчасно, вихідна система (або сам канал) зазвичай надсилає іншу копію повідомлення. В результаті у нас може бути дублікат повідомлення на стороні цільової системи. Якщо цільова система ідентична, вона піклується про це, і результат не буде іншим. Якщо цільова система не є ідентичною, ми повинні реалізувати дедупликатор на цільовій системі каналу.


Імпотенція одиничних запитів, надісланих ізольовано від будь-яких інших запитів (або будь-чого іншого, що відбувається, що змінює стан системи), не є такою ж, як упорядкування запитів. Запит HTTP PUT та запит HTTP DELETE мають бути індивідуально ідентичними, але це не означає, що порядок виклику PUT і DELETE за однією і тією ж URL-адресою не має значення, оскільки запит PUT може мати побічні ефекти!
Робін Грін

1

Коротше кажучи , операції Idempotent означають, що операція не призведе до різних результатів незалежно від того, скільки разів ви виконуєте операції idempotent.

Наприклад, згідно з визначенням специфікації HTTP, GET, HEAD, PUT, and DELETEце ідентичні операції; проте POST and PATCHце не так. Ось чому іноді POSTзамінюється на PUT.


-4

повторно безпечний.

Зазвичай це найпростіший спосіб зрозуміти його значення в інформатиці.


1
Повторне намагання означає щось, що вийшло з ладу в перший чи попередній раз. Не зовсім те саме.
Лассе В. Карлсен

Хто відредагував моє запитання і відмовив мене від голосу? Це не текст, який я розмістив ??
текнопаул

Ви можете перевірити журнал редагування, натиснувши посилання під вашою відповіддю, де написано "відредаговано X годин тому" або подібне.
Лассе В. Карлсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.