Определение идемпотентности

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

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

Понял, достаточно легко.

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

Поясню на примере:

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

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

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


person Didaxis    schedule 14.12.2011    source источник
comment
Не следует ли перенести это на математический форум? (Для всей ясности: я не минусовал)   -  person Roy Dictus    schedule 14.12.2011
comment
Зависит от того, говорим ли мы об определении в формальной логике или об определении в веб-программировании. Я подозреваю, что даунвотер (не я) просто подумал, что вопрос некорректен.   -  person Ernest Friedman-Hill    schedule 14.12.2011
comment
@ Рой - я так не думаю, поскольку это относится непосредственно к веб-службам RESTful, и это контекст, в котором я написал пример.   -  person Didaxis    schedule 14.12.2011
comment
Я думаю, что это уместно обсудить здесь, поскольку есть определенные приложения CS, обсуждаемые в середине страницы здесь: en. wikipedia.org/wiki/Идемпотентность   -  person Jonathan M    schedule 14.12.2011
comment
это может быть полезно для тех, кто хочет понять концепцию: pedrorijo.com/blog/fp-concepts   -  person pedrorijo91    schedule 24.02.2017


Ответы (4)


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

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

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

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

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

person Bruno    schedule 14.12.2011
comment
Отсюда мы можем заключить, что в этом примере PUT является идемпотентным в контексте одного запроса. Но даже когда он чередуется с другими одновременными запросами, он все еще идемпотентный, поскольку результат первой операции следует за свойством идемпотентности, не так ли? - person Amit Dash; 13.08.2014

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

person Michael J. Barber    schedule 14.12.2011
comment
@JonathanM Извините, я не понимаю вашей точки зрения. abs(abs(x)) = abs(x) для всех x, над действительными или комплексными числами. Если вы считаете, что abs не соответствует тому, что я сказал, приведите контрпример. - person Michael J. Barber; 14.12.2011

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

person Ernest Friedman-Hill    schedule 14.12.2011
comment
Но состояние, которое вообще не изменится, недействительно, верно? Это будут GET, HEAD, OPTIONS и TRACE. - person Didaxis; 14.12.2011

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

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

person fge    schedule 14.12.2011
comment
Ваше определение противоречит приведенному здесь: en.wikipedia.org/wiki/Idempotence. Страница сначала размещает abs() как идемпотентную функцию, но по вашему определению это не так. - person Jonathan M; 14.12.2011
comment
Это просто неправильно. Вы определили идемпотентность как эквивалент функции тождества. Вы неявно предполагаете, что операция уже была выполнена с x. - person Michael J. Barber; 14.12.2011
comment
Я подозреваю, что вы могли бы немного уточнить свой ответ без особых проблем; Было бы полезно связать идемпотентность конкретно с операциями PUT. - person Michael J. Barber; 14.12.2011
comment
Если я правильно понимаю, каждая функция тождества идемпотентна, но обратное неверно. - person Amit Dash; 13.08.2014