Відповіді:
В обчислювальній роботі ідентична потужність - це операція, яка не має додаткового ефекту, якщо її викликають більше одного разу з тими ж вхідними параметрами. Наприклад, видалення елемента з набору можна вважати операцією, що набуває бездоменної дії.
У математиці ідентифікаційна операція - це операція, де 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 року, стосуються старішої редакції.
set
прикладі Python у відповіді заданий об'єкт чітко має стан, а також пропонує деякі ідентичні операції, такі як discard
.
discard
також може бути реалізовані таким чином , особи без громадянства, охоплюючи стан в повернутому значенні: discard([my_set, x]) = [my_new_set, x]
. Так ви можете зробити discard(discard([my_set, x]))
. Зауважте, що [my_new_set, x]
це лише один аргумент, і його тип є 2-кратним.
discard(x)
вдруге матиме такий самий ефект, як і виклик першого разу: Набір більше не міститиме x
. Обчислювальна імпотенція стосується надійності системи. Оскільки речі можуть вийти з ладу (наприклад, відключення мережі), як виявити несправність, як відновитись? Найпростіше відновлення - це просто зробити це знову, але це працює, лише якщо це зробити знову - безвідмовно. Напр. discard(x)
, Ідентичний, але pop()
ні. Вся справа у відновленні помилок.
Ідентичну операцію можна повторити довільну кількість разів, і результат буде таким самим, як якщо б це було зроблено лише один раз. У арифметиці додавання нуля до числа є ідентичним.
Про ідентифікацію багато говорять у контексті "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 .
Незалежно від того, скільки разів ви викликаєте операцію, результат буде однаковим.
truncate
і delete
.
Ідентифікація означає, що застосування операції один раз або застосування декількох разів має однаковий ефект.
Приклади:
Для чистих функцій (функцій, які не мають побічних ефектів), тоді idempotency означає, що f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... для всіх значень х
Для функцій з побічними ефектами idempotency, крім того, означає, що ніяких додаткових побічних ефектів після першого застосування не буде викликано. Ви можете вважати стан світу додатковим «прихованим» параметром функції, якщо вам це подобається.
Зауважте, що у світі, де у вас відбуваються одночасні дії, ви можете виявити, що операції, які ви вважали ідентичними, перестають бути такими (наприклад, інший потік може скасувати значення булевого прапора у наведеному вище прикладі). В основному, коли у вас є паралельність і незмінний стан, вам потрібно набагато ретельніше подумати про ідентифікацію.
Idempotency часто є корисною властивістю для створення надійних систем. Наприклад, якщо є ризик, що ви можете отримати повторне повідомлення від третьої сторони, корисно, щоб обробник повідомлень діяв як ідентична операція, щоб ефект повідомлення відбувся лише один раз.
f(x) = f(f(x))
, ви маєте на увазі, що f(x){return x+1;}
це не чиста функція? тому що f(x) != f(f(x))
: f(1)
дає 2, а f(2)
дає 3.
f(x) = f(f(x))
. Але, як згадував @GregHewgill, для того, щоб це визначення мало сенс, ви повинні розглядати x
як об'єкт і f
як операцію, яка мутує стан об'єкта (тобто: вихід f
є мутованим x
).
Ідемогенна операція видає результат у тому самому стані, навіть якщо ви викликаєте його не один раз, за умови, що ви передаєте ті самі параметри.
Просто хотілося викинути справжній випадок використання, який демонструє ідентичність. У 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');
Імпотентна операція - це операція, дія чи запит, які можна застосувати кілька разів, не змінюючи результат, тобто стан системи, поза початковою програмою.
ПРИКЛАДИ (КОНТЕКСТ WEB APP):
ІДЕМПОТЕНТ: Оформлення декількох однакових запитів має той самий ефект, що і подання одного запиту. Повідомлення в системі обміну повідомленнями електронної пошти відкривається і позначається як "відкрито" в базі даних. Повідомлення можна відкривати багато разів, але ця повторна дія завжди призведе до того, що це повідомлення перебуває у "відкритому" стані. Це безвідмовна операція. Перший раз, коли PUT вносить оновлення до ресурсу, використовуючи інформацію, яка не відповідає ресурсу (стан системи), стан системи змінюватиметься по мірі оновлення ресурсу. Якщо один PUT один і той же оновлення ресурсу повторно, то інформація в оновлення буде відповідати інформації, яка вже є в системі при кожному PUT, і жодна зміна стану системи не відбудеться. Повторні PUT з однаковою інформацією є ідентичними:
НЕ-ІДЕМПОТЕНТ: Якщо операція завжди спричиняє зміну стану, наприклад, надсилання одного і того ж повідомлення користувачеві знову і знову, в результаті чого щоразу надсилається та зберігається нове повідомлення в базі даних, ми говоримо, що операція НЕ-ІДЕМПОТЕНТ.
NULLIPOTENT: Якщо операція не має побічних ефектів, наприклад, чисто відображення інформації на веб-сторінці без будь-яких змін у базі даних (іншими словами, ви лише читаєте базу даних), ми говоримо, що операція NULLIPOTENT. Усі GET повинні бути недійсними.
Коли ми говоримо про стан системи, ми, очевидно, ігноруємо надію нешкідливі та неминучі ефекти, такі як реєстрація та діагностика.
Ідентичні операції: операції, які не мають побічних ефектів, якщо виконуються кілька разів.
Приклад : Операція, яка витягує значення з ресурсу даних і, скажімо, друкує
неідентичні операції: Операції, які можуть заподіяти шкоду, якщо виконуватись кілька разів. (У міру зміни деяких значень або станів)
Приклад: Операція, яка знімає з банківського рахунку
Досить детальні та технічні відповіді. Просто додайте просте визначення.
Idempotent = Повторно запущений
Наприклад,
Create
сама по собі операція не гарантується без помилок, якщо виконується більше одного разу. Але якщо є операція, CreateOrUpdate
то вона заявляє про повторну експлуатацію (Idempotency).
Безпосередня операція над набором залишає його членів незмінними при застосуванні один або кілька разів.
Це може бути одинарна операція, як абсолютна (x), де x належить до множини натуральних чисел. Тут абсолютна (абсолютна (х)) = х.
Це може бути двійкова операція, як об'єднання множини із собою завжди повертає один і той же набір.
ура
Будь-яка операція, коли кожен n-й результат призведе до виходу, що відповідає значенню першого результату. Наприклад, абсолютне значення -1 дорівнює 1. Абсолютне значення абсолютного значення -1 дорівнює 1. Абсолютне значення абсолютного значення абсолютного значення -1 дорівнює 1. І так далі.
Дивіться також: Коли буде справді нерозумно використовувати рекурсію?
Хорошим прикладом розуміння самодіяльної операції може бути заблокування автомобіля за допомогою дистанційного ключа.
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
- це безвідмовна операція. Навіть якщо кожен раз, коли ви біжите lock
, є якісь побічні ефекти , як моргання, машина все ще знаходиться в тому ж самому заблокованому стані, незалежно від того, скільки разів ви виконуєте роботу блокування.
мій 5в: В інтеграції та налагодженні мереж ідентифікація дуже важлива. Кілька прикладів із реального життя: Уявіть, ми доставляємо дані до цільової системи. Дані, доставлені послідовністю повідомлень. 1. Що буде, якщо послідовність буде змішана в каналі? (Як завжди роблять мережеві пакети :)). Якщо цільова система ідентична, результат не буде іншим. Якщо цільова система залежить від правильного порядку в послідовності, нам доведеться впровадити реквенсер на цільовому сайті, який би відновив правильний порядок. 2. Що буде, якщо є дублікати повідомлень? Якщо канал цільової системи не розпізнає своєчасно, вихідна система (або сам канал) зазвичай надсилає іншу копію повідомлення. В результаті у нас може бути дублікат повідомлення на стороні цільової системи. Якщо цільова система ідентична, вона піклується про це, і результат не буде іншим. Якщо цільова система не є ідентичною, ми повинні реалізувати дедупликатор на цільовій системі каналу.
Коротше кажучи , операції Idempotent означають, що операція не призведе до різних результатів незалежно від того, скільки разів ви виконуєте операції idempotent.
Наприклад, згідно з визначенням специфікації HTTP, GET, HEAD, PUT, and DELETE
це ідентичні операції; проте POST and PATCH
це не так. Ось чому іноді POST
замінюється на PUT
.
повторно безпечний.
Зазвичай це найпростіший спосіб зрозуміти його значення в інформатиці.
Idempotent operations are often used in the design of network protocols
ось пов'язаний приклад ** GET не передбачає нічого змінювати на сервері, тому GET є ідентичним. У контексті HTTP / сервлету це означає, що один і той же запит може бути зроблений двічі без негативних наслідків. ** POST НЕ ідентичний.