Определение идемпотентности - PullRequest
11 голосов
/ 14 декабря 2011

Таким образом, "идемпотентность" может быть определена как:

Действие, которое при выполнении N раз имеет тот же эффект, что и выполнение действия только один раз.

Понял, достаточно просто.

У меня вопрос к тонкости этого определения - действие считается идемпотентным само по себе, или вы также должны учитывать данные, передаваемые в действие?

Позвольте мне уточнить на примере:

Предположим, у меня есть метод PUT, который обновляет некоторый ресурс, мы назовем его f(x)

Очевидно, f(3) является идемпотентом, пока я поставляю 3 в качестве входа. И столь же очевидно, что f(5) изменит значение ресурса (то есть больше не будет 3 или того значения, которое было там ранее)

Итак, когда мы говорим об идемпотентности, мы имеем в виду обобщение действия / функции, например (например, f(x)), или мы имеем в виду действие / функцию + данные, передаваемые в нее (т.е. *)

Ответы [ 4 ]

5 голосов
/ 14 декабря 2011

Предположим, у меня есть метод PUT, который обновляет некоторый ресурс, мы его назовем F (X) * +1002 *

Очевидно, что f (3) идемпотентна, пока я поставляю 3 в качестве входа. А также одинаково очевидно, что f (5) изменит значение ресурса (т.е. больше не будет 3 или любого другого значения, которое было там ранее).

Это очевидно только в том случае, если реализация сервера такова, что PUT соблюдает это идемпотентное свойство. В контексте HTTP RFC 2616 говорит: :

Методы также могут иметь свойство "идемпотентности" в этом (кроме из-за ошибок или истечения срока действия) побочные эффекты N> 0 идентичны запросы такие же, как для одного запроса.

Немного не по теме ... В распределенной системе, такой как Интернет, вы также можете учитывать коммутативность и одновременные запросы. Например, N + 1 того же запроса PUT (x1) должен иметь тот же эффект, но вы не знаете, сделал ли другой клиент другой запрос PUT (x2) между вами, поэтому пока n PUT (x1) = PUT (x1) и m PUT (x2) = PUT (x2), два набора запросов могут чередоваться.

5 голосов
/ 14 декабря 2011

Идемпотентность требует, чтобы действие выполнялось для всех значений в его домене, то есть f(f(x)) = f(x) для всех x. Другой способ думать об этом состоит в том, что операция является идемпотентной, если состав операции с самим собой является только этой операцией.

3 голосов
/ 14 декабря 2011

Это не совсем определение идемпотентности.Функция идемпотентна, если для любого элемента x f (f (x)) == f (x).

PUT - это побочный эффект вашей функции f (), а не ее результат.

3 голосов
/ 14 декабря 2011

Вы предполагаете, что идемпотентность означает, что состояние сервера будет изменено самое большее один раз серией вызовов.Чаще всего люди используют этот термин для обозначения того, что состояние на сервере не будет изменено вообще при любом количестве вызовов.При таких обстоятельствах различие между вашими двумя делами несущественно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...