Ce este o operație idempotentă?
Ce este o operație idempotentă?
Răspunsuri (15)
În calcul, o operație idempotentă este una care nu are niciun efect suplimentar dacă este apelată de mai multe ori cu aceiași parametri de intrare. De exemplu, eliminarea unui articol dintr-un set poate fi considerată o operație idempotentă pe set.
În matematică, o operație idempotent este una în care f(f(x)) = f(x). De exemplu, funcția abs()
este idempotentă deoarece abs(abs(x)) = abs(x)
pentru toate x
.
Aceste definiții ușor diferite pot fi reconciliate considerând că x în definiția matematică reprezintă starea unui obiect, iar f este o operație care poate modifica acel obiect. De exemplu, luați în considerare Python set
și metoda sa discard
. Metoda discard
elimină un element dintr-un set și nu face nimic dacă elementul nu există. Asa de:
my_set.discard(x)
are exact același efect ca și efectuarea aceleiași operații de două ori:
my_set.discard(x)
my_set.discard(x)
Operațiunile idempotente sunt adesea folosite în proiectarea protocoalelor de rețea, în cazul în care o solicitare de a efectua o operațiune este garantată să se întâmple cel puțin o dată, dar se poate întâmpla și de mai multe ori. Dacă operația este idempotentă, atunci nu există niciun rău în efectuarea operației de două sau mai multe ori.
Consultați articolul Wikipedia despre idempotence pentru mai multe informații.
Răspunsul de mai sus a avut anterior câteva exemple incorecte și înșelătoare. Comentariile de mai jos scrise înainte de aprilie 2014 se referă la o revizuire mai veche.
Idempotent operations are often used in the design of network protocols
iată un exemplu înrudit ** GET nu ar trebui să schimbe nimic pe server, deci GET este, idempotent. În contextul HTTP/servlet, înseamnă că aceeași solicitare poate fi făcută de două ori fără consecințe negative. **POST NU este idempotent.
- person KNU; 01.04.2014
set
din răspuns, obiectul setat are în mod clar stare și oferă, de asemenea, unele operații idempotente, cum ar fi discard
.
- person Greg Hewgill; 07.12.2014
discard
operează pe stare, dar returnează același rezultat dacă este apelată de mai multe ori cu aceiași parametri de intrare; discard
doar lucrează diferit pentru a ajunge la acel rezultat. Vă mulțumim pentru ajutor.
- person Michael Osofsky; 08.12.2014
discard
poate fi implementat și într-un mod apatrid, cuprinzând starea în valoarea returnată: discard([my_set, x]) = [my_new_set, x]
. Deci poți face discard(discard([my_set, x]))
. Rețineți că [my_new_set, x]
este doar un argument și tipul său este 2-tuplu.
- person Pacerier; 11.03.2015
array.pop()
operația dăunează setului de fiecare dată când este apelat.
- person Green; 10.10.2015
undefined
și setul nu este modificat. Deci, unde este același efect despre care vorbești? Absolut diferit. Dar orice apeluri ulterioare au într-adevăr același efect: obțineți undefined
și un set nu este modificat. Chiar nu inteleg idempotenta de calcul.
- person Green; 10.10.2015
discard(x)
a doua oară va avea același efect ca și prima dată: setul nu va mai conține x
. Idempotenta de calcul se referă la robustețea unui sistem. Deoarece lucrurile pot eșua (de exemplu, întreruperea rețelei), atunci când este detectată o defecțiune, cum vă recuperați? Cea mai ușoară recuperare este să o faci din nou, dar asta funcționează doar dacă a o face din nou este idempotent. De exemplu. discard(x)
este idempotent, dar pop()
nu este. Totul este despre recuperarea erorilor.
- person Andreas; 27.04.2016
DELETE
. Dacă acesta nu este idempotent, cum este DELETE
idempotent?
- person Franklin Yu; 20.12.2017
DELETE
poate returna 404 (negăsit), ceea ce înseamnă că dacă obțineți 404 sau 200 (sau 202, sau 204), știți că ai ceea ce ai vrut. Deci, în ceea ce vă privește, 404 este un răspuns valid care spune că ceea ce ați cerut a fost făcut. Ca atare, metoda este idempotentă. În acest caz, 404 și 200 înseamnă ambele OK.
- person Andreas; 20.12.2017
O operație idempotentă poate fi repetată de un număr arbitrar de ori și rezultatul va fi același ca și cum ar fi fost făcută o singură dată. În aritmetică, adăugarea zero la un număr este idempotent.
Despre Idempotenta se vorbeste mult in contextul serviciilor web „RESTful”. REST caută să folosească la maximum HTTP pentru a oferi programelor acces la conținutul web și este de obicei setat în contrast cu serviciile web bazate pe SOAP, care doar tunelează serviciile de tip apel de procedură la distanță în interiorul cererilor și răspunsurilor HTTP.
REST organizează o aplicație web în „resurse” (cum ar fi un utilizator Twitter sau o imagine Flickr) și apoi utilizează verbele HTTP ale POST, PUT, GET și DELETE pentru a crea, actualiza, citi și șterge acele resurse.
Idempotenta joaca un rol important in REST. Dacă GET o reprezentare a unei resurse REST (de exemplu, GET o imagine jpeg de pe Flickr) și operațiunea eșuează, puteți doar să repetați GET din nou și din nou până când operația reușește. Pentru serviciul web, nu contează de câte ori este primită imaginea. De asemenea, dacă utilizați un serviciu web RESTful pentru a vă actualiza informațiile contului Twitter, puteți PUNE noile informații de câte ori este nevoie pentru a obține confirmarea de la serviciul web. PUNEȚI-o de o mie de ori este același lucru cu PUNEȚI-O odată. În mod similar, ștergerea unei resurse REST de o mie de ori este același lucru cu ștergerea acesteia o dată. Idempotenta ușurează astfel construirea unui serviciu web care să fie rezistent la erorile de comunicare.
Citiri suplimentare: RESTful Web Services, de Richardson și Ruby (idempotenta este discutată la paginile 103-104), și teza de doctorat a lui Roy Fielding pe REST. Fielding a fost unul dintre autorii HTTP 1.1, RFC-2616, care vorbește despre idempotence în secțiunea 9.1.2.
PUT
în loc de POST
deoarece PUT
este idempotent. dacă cererea PUT
eșuează, o putem retrimite până când primim un răspuns de succes de la server. Ce mă împiedică să retrimit o solicitare POST
nereușită (actualizarea)? Se va întâmpla ceva în neregulă?
- person mangusta; 15.02.2020
Indiferent de câte ori suni la operație, rezultatul va fi același.
truncate
și delete
.
- person Pacerier; 11.03.2015
Idempotenta inseamna ca aplicarea unei operatii o data sau aplicarea ei de mai multe ori are acelasi efect.
Exemple:
- Înmulțirea cu zero. Indiferent de câte ori o faci, rezultatul este tot zero.
- Setarea unui steag boolean. Indiferent de câte ori o faci, steagul rămâne fixat.
- Ștergerea unui rând dintr-o bază de date cu un ID dat. Dacă încercați din nou, rândul este încă dispărut.
Pentru funcții pure (funcții fără efecte secundare), atunci idempotenta implică faptul că f(x) = f(f(x)) = f(f(f(x))) = f(f(f) (f(x)))) = ...... pentru toate valorile lui x
Pentru funcțiile cu efecte secundare, idempotenta implică, de asemenea, că nu vor fi cauzate efecte secundare suplimentare după prima aplicare. Puteți considera starea lumii ca fiind un parametru „ascuns” suplimentar pentru funcție, dacă doriți.
Rețineți că într-o lume în care aveți acțiuni concurente, este posibil să descoperiți că operațiunile pe care le credeați că sunt idempotente încetează să mai fie așa (de exemplu, un alt fir ar putea anula valoarea steagului boolean din exemplul de mai sus). Practic, ori de câte ori ai concurență și stare mutabilă, trebuie să te gândești mult mai atent la idempotență.
Idempotenta este adesea o proprietate utilă în construirea de sisteme robuste. De exemplu, dacă există riscul să primiți un mesaj duplicat de la o terță parte, este util ca handlerul de mesaje să acționeze ca o operație idempotent, astfel încât efectul mesajului să se întâmple o singură dată.
f(x) = f(f(x))
, vrei să spui că f(x){return x+1;}
nu este o funcție pură? pentru că f(x) != f(f(x))
: f(1)
dă 2 în timp ce f(2)
dă 3.
- person Pacerier; 11.03.2015
f(x) = f(f(x))
. Dar, așa cum a menționat @GregHewgill, pentru ca această definiție să aibă sens, trebuie să considerați x
ca un obiect și f
ca o operație care modifică starea obiectului (adică: ieșirea lui f
este un x
mutant).
- person Justin J Stark; 17.10.2016
O operație idempotentă produce rezultatul în aceeași stare chiar dacă îl apelezi de mai multe ori, cu condiția să treci în aceiași parametri.
Am vrut doar să arunc un caz real de utilizare care demonstrează idempotenta. În JavaScript, să presupunem că definiți o mulțime de clase de model (ca în modelul MVC). Modul în care este adesea implementat este echivalent funcțional cu ceva de genul acesta (exemplu de bază):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
Apoi puteți defini noi clase, astfel:
var User = model('user');
var Article = model('article');
Dar dacă ar fi să încercați să obțineți clasa User
prin model('user')
, din altă parte din cod, ar eșua:
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
Acei doi constructori User
ar fi diferiți. Acesta este,
model('user') !== model('user');
Pentru a-l face idempotent, trebuie doar să adăugați un fel de mecanism de stocare în cache, ca acesta:
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
Adăugând cache, de fiecare dată când ați făcut model('user')
, va fi același obiect și deci este idempotent. Asa de:
model('user') === model('user');
Un bun exemplu de înțelegere a unei operațiuni idempotente ar putea fi încuierea unei mașini cu cheia de la distanță.
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
este o operație idempotent. Chiar dacă există un efect secundar de fiecare dată când rulați lock
, cum ar fi clipirea, mașina este încă în aceeași stare de blocare, indiferent de câte ori rulați operația de blocare.
O operație idempotentă este o operație, acțiune sau cerere care poate fi aplicată de mai multe ori fără a modifica rezultatul, adică starea sistemului, dincolo de aplicarea inițială.
EXEMPLE (CONTEXTUL APLICAȚIEI WEB):
IDEMPOTENT: Efectuarea mai multor cereri identice are același efect ca și efectuarea unei singure cereri. Un mesaj dintr-un sistem de mesagerie prin e-mail este deschis și marcat ca „deschis” în baza de date. Se poate deschide mesajul de mai multe ori, dar această acțiune repetată va avea ca rezultat doar ca mesajul să fie în starea „deschis”. Aceasta este o operație idempotentă. Prima dată când se pune o actualizare a unei resurse folosind informații care nu se potrivesc cu resursa (starea sistemului), starea sistemului se va schimba pe măsură ce resursa este actualizată. Dacă cineva pune aceeași actualizare la o resursă în mod repetat, atunci informațiile din actualizare se vor potrivi cu informațiile deja din sistem la fiecare PUT și nu va avea loc nicio modificare a stării sistemului. PUT-urile repetate cu aceleași informații sunt idempotente: primul PUT poate schimba starea sistemului, iar PUT-urile ulterioare nu ar trebui.
NEIMPOTENT: Dacă o operație provoacă întotdeauna o schimbare a stării, cum ar fi POSTAREA aceluiași mesaj către un utilizator de nenumărate ori, rezultând un mesaj nou trimis și stocat în baza de date de fiecare dată, spunem că operația este NEIMPOTENT.
NULIPOTENT: Dacă o operațiune nu are efecte secundare, cum ar fi afișarea exclusivă a informațiilor pe o pagină web fără nicio modificare a unei baze de date (cu alte cuvinte, citiți doar baza de date), spunem că operația este NULIPOTENT. Toate GET-urile ar trebui să fie nulipotente.
Când vorbim despre starea sistemului, ignorăm în mod evident efectele inofensive și inevitabile, cum ar fi înregistrarea și diagnosticarea.
Raspunsuri destul de detaliate si tehnice. Adăugând doar o definiție simplă.
Idempotent = Re-runnable
De exemplu, operația Create
în sine nu este garantată să ruleze fără eroare dacă este executată de mai multe ori. Dar dacă există o operație CreateOrUpdate
, atunci ea afirmă re-runnability (Idempotity).
Operații idempotente: operațiuni care nu au efecte secundare dacă sunt executate de mai multe ori.
Exemplu: o operațiune care preia valori dintr-o resursă de date și, de exemplu, o tipărește
Operații non-idempotente: operațiuni care ar provoacă un anumit rău dacă este executat de mai multe ori. (Pe măsură ce modifică unele valori sau stări)
Exemplu: o operațiune care retrage dintr-un cont bancar
O operație idempotentă asupra unui set își lasă membrii neschimbați atunci când este aplicat o dată sau de mai multe ori.
Poate fi o operație unară, cum ar fi absolute(x), unde x aparține unui set de numere întregi pozitive. Aici absolut(absolut(x)) = x.
Poate fi o operație binară, cum ar fi uniunea unui set cu el însuși ar returna întotdeauna același set.
noroc
Pe scurt, operațiunile idempotente înseamnă că operația nu va avea ca rezultat rezultate diferite, indiferent de câte ori operați operațiunile idempotente.
De exemplu, conform definiției specificației HTTP, GET, HEAD, PUT, and DELETE
sunt operații idempotente; totuși POST and PATCH
nu sunt. De aceea, uneori, POST
este înlocuit cu PUT
.
my 5c: În integrare și rețea, idempotenta este foarte importantă. Câteva exemple din viața reală: Imaginați-vă că livrăm date către sistemul țintă. Date furnizate printr-o succesiune de mesaje. 1. Ce s-ar întâmpla dacă secvența este mixată în canal? (Așa cum fac întotdeauna pachetele de rețea :) ). Dacă sistemul țintă este idempotent, rezultatul nu va fi diferit. Dacă sistemul țintă depinde de ordinea corectă în secvență, trebuie să implementăm resequencer pe site-ul țintă, care ar restabili ordinea corectă. 2. Ce s-ar întâmpla dacă există mesaje duplicate? Dacă canalul sistemului țintă nu confirmă în timp util, sistemul sursă (sau canalul însuși) trimite de obicei o altă copie a mesajului. Ca rezultat, putem avea un mesaj duplicat pe partea sistemului țintă. Dacă sistemul țintă este idempotent, are grijă de el și rezultatul nu va fi diferit. Dacă sistemul țintă nu este idempotent, trebuie să implementăm deduplicator pe partea sistemului țintă a canalului.
reîncercați în siguranță.
Este de obicei cel mai simplu mod de a-i înțelege semnificația în informatică.
f(f(x)) = f(x)
. Continuați să citiți răspunsurile pentru un conținut mai descriptiv!! - person paradocslover   schedule 02.07.2021