2011-12-14 17 views
11

Así "idempotencia" se puede definir como:Definición idempotencia

una acción, que si se realiza N veces tiene el mismo efecto que el que realiza la acción sólo una vez.

Lo tengo, bastante fácil.

Mi pregunta es acerca de la sutileza de esta definición: ¿es una acción considerada idempotente por sí misma, o también debe considerar los datos que se pasan a la acción?

quiero aclarar con un ejemplo:

Supongamos que tengo un método PUT que actualiza algún recurso, lo llamaremos f(x)

Obviamente, f(3) es idempotente, siempre y cuando la fuente 3 como el entrada. E igualmente obvio, f(5) cambiará el valor del recurso (es decir, ya no será 3 o el valor que existía previamente)

Entonces, cuando hablamos de idempotencia, ¿nos referimos a la generalización de la acción/función Me gusta (es decir, f(x)), o nos referimos a la acción/función + los datos que se pasan a ella (es decir, f(3))?

+1

¿No debería moverse esto al foro de Matemáticas? (Para mayor claridad: no voté negativamente) –

+0

Depende si estamos hablando de una definición en lógica formal o una definición en programación web. Sospecho que el infractor (no yo) simplemente pensó que la pregunta estaba mal planteada. –

+1

@Roy - No lo creo, ya que se aplica directamente a los servicios web RESTful, y ese es el contexto en el que escribí el ejemplo en – Didaxis

Respuesta

5

Supongamos que tengo un método PUT que actualiza algún recurso, vamos a llamarlo f (x)

Obviamente, f (3) es idempotente, siempre y cuando la fuente 3 que la entrada. Y igualmente obvio, f (5) cambiará el valor del recurso (es decir, ya no será 3 o el valor que haya estado allí anteriormente).

Esto es solo obvio es que la implementación del servidor es tal que PUT respeta esta propiedad idempotente. En el contexto de HTTP, RFC 2616 says:

Los métodos también pueden tener la propiedad de "idempotencia" en que (aparte de problemas de error o de vencimiento) los efectos secundarios de los N> 0 idénticos solicitudes es el lo mismo que para una sola solicitud.

Yendo un poco fuera de tema ... En un sistema distribuido, como la web, es posible que también desee considerar la conmutatividad y solicitudes simultáneas. Por ejemplo, N + 1 de la misma solicitud PUT (x1) debería tener el mismo efecto, pero no sabe si otro cliente realizó una solicitud PUT (x2) diferente entre los suyos, por lo que mientras n PUT (x1) = PUT (x1) ym PUT (x2) = PUT (x2), los dos conjuntos de solicitudes podrían estar entrelazados.

+0

Así que de esto podemos concluir, en este ejemplo, PUT es idempotente en el contexto de una sola solicitud. Pero incluso cuando está intercalado con otras solicitudes simultáneas, sigue siendo idempotente, ya que el resultado de la primera operación siguió a la propiedad de idempotencia, ¿no es así? –

3

Está asumiendo que idempotence significa que el estado del servidor se cambiará como máximo una vez mediante una serie de invocaciones. La mayoría de las veces, las personas usan este término para significar que el estado en el servidor no se cambiará en absoluto por cualquier cantidad de invocaciones. Bajo estas circunstancias, la distinción entre sus dos casos es inmaterial.

+3

pero declara que "ganó" t ser cambiado en absoluto "es" nullipotent ", ¿verdad? Esto sería GET, HEAD, OPTIONS, y TRACE – Didaxis

5

Idempotence requiere que la acción se mantenga para todos los valores de su dominio, es decir, f(f(x)) = f(x) para todos x. Otra forma de pensar es que una operación es idempotente si la composición de la operación consigo misma es solo esa operación.

+0

@JonathanM Lo siento, no entiendo tu punto. 'abs (abs (x)) = abs (x)' para toda 'x', sobre los reales o los números complejos. Si piensas que 'abs' no coincide con lo que dije, por favor da un contraejemplo. –

3

Esta no es exactamente la definición de idempotencia. Una función es idempotente si para cualquier elemento x, f (f (x)) == f (x).

PUT es un efecto secundario de su función f() aquí, no el resultado.

+0

Su definición va en contra de la que se da aquí: http://en.wikipedia.org/wiki/Idempotence. La primera página de sitios 'abs()' como una función idempotente, pero no sería por su definición. –

+0

Esto es simplemente incorrecto. Usted ha definido idempotence para ser equivalente a la función de identidad. Estás asumiendo implícitamente que la operación ya se realizó para x. –

+0

Sí, es cierto, disculpe la confusión ... – fge