2011-12-14 8 views
11

Così "idempotence" può essere definito come:Definizione idempotence

Un'azione, che se eseguite N volte ha lo stesso effetto di eseguire l'azione una sola volta.

Capito, abbastanza facile.

La mia domanda riguarda la sottigliezza di questa definizione -si un'azione considerata idempotente di per sé, o deve prendere in considerazione anche i dati che vengono passati in azione?

Vorrei chiarire con un esempio:

Supponiamo che io sono un metodo PUT che aggiorna alcune risorse, che chiameremo f(x)

Ovviamente, f(3) è idempotente, finché io fornisco 3 come ingresso. E ugualmente ovvio, f(5) cambierà il valore della risorsa (cioè non sarà più 3 o qualunque valore fosse precedentemente)

Quindi quando parliamo di idempotenza, ci riferiamo alla generalizzazione dell'azione/funzione come (es., f(x)), o ci riferiamo all'azione/funzione + ai dati che ci sono passati (ad esempio, f(3))?

+1

Non dovrebbe essere spostato nel forum Mathematics? (Per tutta chiarezza: non ho fatto downvote) –

+0

Dipende se parliamo di una definizione in logica formale o di una definizione in programmazione web. Sospetto che il downvoter (non io) abbia pensato che la domanda fosse mal posta. –

+1

@Roy: non credo, poiché si applica direttamente ai servizi web RESTful, e questo è il contesto in cui ho scritto l'esempio in – Didaxis

risposta

5

Supponiamo che io sono un metodo PUT che aggiorna alcune risorse, che chiameremo f (x)

Ovviamente, f (3) è idempotente, finché io tensione 3 come ingresso. E altrettanto evidente, f (5) cambierà il valore della risorsa (cioè essa sarà più 3 o qualsiasi valore era precedentemente).

Ciò è ovvio solo se l'implementazione del server è tale che PUT rispetta questa proprietà idempotente. Nel contesto di HTTP, RFC 2616 says:

metodi possono avere la proprietà di "idempotence" in quanto (a parte da problemi di errore o di scadenza) gli effetti collaterali di N> 0 identici richieste è il come per una singola richiesta.

Andando un po 'fuori tema ... In un sistema distribuito come il web, si può anche prendere in considerazione commutativity e richieste simultanee. Ad esempio N + 1 della stessa richiesta PUT (x1) dovrebbe avere lo stesso effetto, ma non sai se un altro client ha fatto una richiesta PUT (x2) diversa tra le tue, così mentre n PUT (x1) = PUT (x1) e m PUT (x2) = PUT (x2), i due gruppi di richieste potrebbero essere intercalati.

+0

Quindi da questo possiamo concludere, in questo esempio, PUT è idempotente nel contesto di una singola richiesta. Ma anche quando è intercalato con altre richieste simultanee, è ancora idempotente in quanto il risultato della prima operazione ha seguito la proprietà di idempotenza, non è vero? –

3

Si presume che l'idempotenza significhi che lo stato del server verrà modificato al massimo una volta da da una serie di invocazioni. La maggior parte del tempo, la gente usa questo termine per indicare che lo Stato sul server non verrà modificato affatto da qualsiasi numero di invocazioni. In queste circostanze, la distinzione tra i due casi è irrilevante.

+3

Ma dichiara che "ha vinto" essere cambiato "è" nullipotent ", giusto? Questo sarebbe GET, HEAD, OPTIONS e TRACE – Didaxis

5

L'idempotenza richiede che l'azione sia valida per tutti i valori sul proprio dominio, ad esempio f(f(x)) = f(x) per tutti x. Un altro modo di pensarci è che un'operazione è idempotente se la composizione dell'operazione con se stessa è solo quell'operazione.

+0

@JonathanM Scusa, non vedo il tuo punto. 'abs (abs (x)) = abs (x)' per tutti 'x', sopra i numeri reali o i numeri complessi. Se ritieni che 'abs' non corrisponda a quello che ho dichiarato, ti preghiamo di dare un controesempio. –

3

Questo non è proprio la definizione di idempotence. Una funzione è idempotente se per qualsiasi elemento x, f (f (x)) == f (x).

PUT è un effetto collaterale della vostra f() la funzione qui, non è il risultato di essa.

+0

La tua definizione va contro quella data qui: http://en.wikipedia.org/wiki/Idempotence. La pagina prima siti 'abs()' come una funzione idempotente, ma non sarebbe dalla vostra definizione. –

+0

Questo è semplicemente sbagliato. Hai definito l'idempotence come equivalente alla funzione di identità. Supponi implicitamente che l'operazione sia già stata eseguita su x. –

+0

Sì, è vero, mi dispiace per la confusione ... – fge