WORDS
Idempotent
Inom programmering är en funktion eller metod är idempotent om ett anrop till den ger samma slutresultat som många anrop. Ett konkret exempel skulle kunna vara en metod Delete(id)
. Att anropa Delete(12)
en eller flera gånger ger samma resultat: elementet med id 12 raderas en enda gång. Man kanske får ett felmeddelande efterföljande gånger ("element med id 12 existerar inte"), men effekten är densamma: elementet fortsätter vara raderat.
Om man vet att en metod är idempotent, så behöver man inte vara rädd för att anropa den flera gånger. Det värsta som kan hända är att det tar lite prestanda och att anropet loggas.
Idempotens gör ett system mer feltolerant och det gör det lättare att debugga, för man kan anta att inga dåliga sidoeffekter sker.
Exempel: Webbshop
En funktion som hämtar kundens namn och adress är idempotent, eftersom databasen inte kommer att ändras. Likaså, att ändra kundens adress, eftersom den slutgiltiga adressen kommer vara densamma oavsett hur många gånger man uppdaterar den. Däremot kommer det inte vara idempotent att lägga en order, eftersom flera anrop kommer att resultera i flera ordrar. Att makulera en order är idempotent, för den fortsätter vara makulerad oavsett hur många anrop som görs.
HTTP och Rest
I HTTP och Rest finns det flera metoder som ska vara idempotenta:
GET
- "hämta data". Ska inte ha någon sidoeffekt över huvud taget (nullipotent).PUT
- "uppdatera data". Man uppdaterar en resurs med den information som skickades med. Att göra ett nytt anrop kommer endast att se till att innehållet ser ut på samma sätt igen.DELETE
- "radera data". Efter att en resurs har raderats, fortsätter den vara raderad vid flera anrop.
I HTTP är det egentligen bara POST
som inte är idempotent.
Loggning
Medan ordet "idempotent" betyder att inget ytterligare får ske vid ett andra anrop, så kan man göra undantag om det är försumbart. Exempelvis kan vi bortse från loggning och annat som mest är till för debuggning. Jag menar alltså att man i en idempotent metod vid behov kan logga också anrop efter det första, så länge det inte har några ytterligare följdeffekter.
Matematik
Idempotens är också ett begrepp inom matematiken med ungefär samma betydelse: att göra en operation en gång ger samma resultat som att göra den flera gånger.
Exempelvis är multiplikation med både 0 och 1 idempotent. Multiplikation med 1 har aldrig någon effekt över huvud taget (nullipotent), medan multiplikation alltid ger resultatet 0, oavsett hur många gånger man multiplicerar med 0.
Slutord
Där möjligt är det ofta värt att göra sina metoder idempotenta. Det är lättare att resonera om sådant som kan ske max en gång, jämfört med sådant som inte har någon begränsning.