Pregunta ¿Qué es una operación idempotente?


¿Qué es una operación idempotente?


654
2017-07-03 01:06


origen


Respuestas:


En informática, una operación idempotente es aquella que no tiene ningún efecto adicional si se llama más de una vez con los mismos parámetros de entrada. Por ejemplo, eliminar un elemento de un conjunto puede considerarse una operación idempotente en el conjunto.

En matemáticas, una operación idempotente es aquella donde f (f (x)) = f (x). Por ejemplo, el abs() la función es idempotente porque abs(abs(x)) = abs(x) para todos x.

Estas definiciones ligeramente diferentes se pueden conciliar al considerar que X en la definición matemática representa el estado de un objeto, y F es una operación que puede mutar ese objeto. Por ejemplo, considere el Pitón set y es discard método. los discard método elimina un elemento de un conjunto y no hace nada si el elemento no existe. Asi que:

my_set.discard(x)

tiene exactamente el mismo efecto que hacer la misma operación dos veces:

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

Las operaciones de Idempotent se utilizan a menudo en el diseño de protocolos de red, donde se garantiza que una solicitud para realizar una operación ocurra al menos una vez, pero también puede ocurrir más de una vez. Si la operación es idempotente, no hay daño en realizar la operación dos o más veces.

Ver el artículo de Wikipedia sobre idempotencia para más información.


La respuesta anterior tenía algunos ejemplos incorrectos y engañosos. Los comentarios a continuación escritos antes de abril de 2014 se refieren a una revisión anterior.


705
2017-07-03 01:10



Una operación idempotente puede repetirse un número arbitrario de veces y el resultado será el mismo que si hubiera sido hecho solo una vez. En aritmética, agregar cero a un número es idempotente.

Idempotence se habla mucho en el contexto de los servicios web "RESTful". REST busca aprovechar al máximo HTTP para dar acceso a los programas al contenido web, y generalmente se establece en contraste con los servicios web basados ​​en SOAP, que simplemente canalizan los servicios de estilo de llamadas a procedimientos remotos dentro de las solicitudes y respuestas HTTP.

REST organiza una aplicación web en "recursos" (como un usuario de Twitter o una imagen de Flickr) y luego usa los verbos HTTP de POST, PUT, GET y DELETE para crear, actualizar, leer y eliminar esos recursos.

La idempotencia juega un papel importante en REST. Si obtienes una representación de un recurso REST (por ejemplo, GET una imagen jpeg de Flickr), y la operación falla, puedes simplemente repetir el GET una y otra vez hasta que la operación tenga éxito. Para el servicio web, no importa cuántas veces se obtenga la imagen. Del mismo modo, si utiliza un servicio web RESTful para actualizar la información de su cuenta de Twitter, puede PONER la nueva información tantas veces como sea necesario para obtener la confirmación del servicio web. PONERLO mil veces es lo mismo que PONERLO una vez. Del mismo modo, ELIMINAR un recurso REST mil veces es lo mismo que borrarlo una vez. Por lo tanto, Idempotence hace que sea mucho más fácil construir un servicio web que sea resistente a los errores de comunicación.

Otras lecturas: Servicios web RESTful, por Richardson y Ruby (idempotence se discute en la página 103-104), y Roy Fielding Disertación de doctorado sobre RESTO. Fielding fue uno de los autores de HTTP 1.1, RFC-2616, que habla de idempotencia en sección 9.1.2.


105
2017-07-03 01:47



No importa cuántas veces llame a la operación, el resultado será el mismo.


77
2017-07-03 01:10



Idempotencia significa que aplicar una operación una vez o aplicarla varias veces tiene el mismo efecto.

Ejemplos:

  • Multiplicación por cero. No importa cuántas veces lo hagas, el resultado sigue siendo cero.
  • Estableciendo un indicador booleano. No importa cuántas veces lo hagas, la bandera permanece establecida.
  • Eliminar una fila de una base de datos con una identificación dada. Si vuelves a intentarlo, la fila aún no está.

por funciones puras (funciones sin efectos secundarios) entonces idempotencia implica que f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x)))) =. ..... para todos los valores de x

por funciones con efectos secundarios, idempotency implica además que no se causarán efectos secundarios adicionales después de la primera aplicación. Puede considerar el estado del mundo como un parámetro "oculto" adicional para la función si lo desea.

Tenga en cuenta que en un mundo en el que tiene acciones simultáneas, puede encontrar que las operaciones que pensó que eran idempotentes dejan de serlo (por ejemplo, otro hilo podría desarmar el valor de la bandera booleana en el ejemplo anterior). Básicamente, siempre que tenga simultaneidad y estado variable, debe pensar mucho más detenidamente sobre la idempotencia.

La idempotencia es a menudo una propiedad útil en la construcción de sistemas robustos. Por ejemplo, si existe el riesgo de que reciba un mensaje duplicado de un tercero, es útil que el manejador de mensajes actúe como una operación idempotente para que el efecto del mensaje solo se produzca una vez.


40
2018-03-05 04:49



Una operación idempotente produce el resultado en el mismo estado incluso si lo llama más de una vez, siempre que pase los mismos parámetros.


21
2017-07-03 01:13



Solo quería arrojar un caso de uso real que demuestre idempotencia. En JavaScript, supongamos que está definiendo un grupo de clases modelo (como en el modelo MVC). La forma en que esto se implementa a menudo es funcionalmente equivalente a algo como esto (ejemplo básico):

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

  return Model;
}

Podrías definir nuevas clases como esta:

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

Pero si intentaras obtener el User clase via model('user'), desde otro lugar en el código, fallaría:

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

Esos dos User los constructores serían diferentes. Es decir,

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

Para hacerlo idempotente, simplemente agregaría algún tipo de mecanismo de almacenamiento en caché, como este:

var collection = {};

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

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

  collection[name] = Model;
  return Model;
}

Al agregar el almacenamiento en caché, cada vez que lo hizo model('user') será el mismo objeto, por lo que es idempotente. Asi que:

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

10
2017-10-09 01:30



Operaciones Idempotentes: Operaciones que no tienen efectos secundarios si se ejecutan varias veces.
Ejemplo: Una operación que recupera valores de un recurso de datos y dice, lo imprime

Operaciones no idóneas: Operaciones que causarían algún daño si se ejecutan varias veces. (A medida que cambian algunos valores o estados)
Ejemplo: Una operación que se retira de una cuenta bancaria


8
2017-12-06 14:42



Una operación idempotente sobre un conjunto deja a sus miembros sin cambios cuando se aplica una o más veces.

Puede ser una operación unaria como absoluto (x) donde x pertenece a un conjunto de enteros positivos. Aquí absoluto (absoluto (x)) = x.

Puede ser una operación binaria como unión de un conjunto consigo mismo siempre devolvería el mismo conjunto.

aclamaciones


6
2017-07-03 01:26