Was ist eine idempotente Operation?
Antworten
Zu viele Anzeigen?In der Informatik ist eine idempotente Operation eine Operation, die keine zusätzlichen Auswirkungen hat, wenn sie mehr als einmal mit denselben Eingabeparametern aufgerufen wird. So kann beispielsweise das Entfernen eines Elements aus einer Menge als idempotente Operation an der Menge betrachtet werden.
In der Mathematik ist eine idempotente Operation eine Operation, bei der f(f(x)) = f(x) . Zum Beispiel die abs()
Funktion ist idempotent, weil abs(abs(x)) = abs(x)
für alle x
.
Diese leicht unterschiedlichen Definitionen lassen sich miteinander in Einklang bringen, wenn man bedenkt, dass x in der mathematischen Definition steht für den Zustand eines Objekts, und f ist eine Operation, die dieses Objekt verändern kann. Betrachten wir zum Beispiel die Python set
und seine discard
Methode. Die Website discard
Methode entfernt ein Element aus einer Menge und tut nichts, wenn das Element nicht vorhanden ist. So:
my_set.discard(x)
hat genau die gleiche Wirkung wie die doppelte Ausführung desselben Vorgangs:
my_set.discard(x)
my_set.discard(x)
Idempotente Operationen werden häufig bei der Entwicklung von Netzprotokollen verwendet, bei denen eine Anforderung zur Durchführung einer Operation garantiert mindestens einmal, aber auch mehr als einmal erfolgen kann. Wenn die Operation idempotent ist, kann es nicht schaden, die Operation zwei- oder mehrmals auszuführen.
Siehe den Wikipedia-Artikel über Leerlauf für weitere Informationen.
Die obige Antwort enthielt bereits einige falsche und irreführende Beispiele. Die nachstehenden Kommentare, die vor April 2014 geschrieben wurden, beziehen sich auf eine ältere Revision.
Eine idempotente Operation kann beliebig oft wiederholt werden, und das Ergebnis ist dasselbe, als ob sie nur einmal durchgeführt worden wäre. In der Arithmetik ist die Addition von Null zu einer Zahl idempotent.
Im Zusammenhang mit "RESTful"-Webdiensten wird viel über Entpotenz gesprochen. REST zielt darauf ab, HTTP optimal zu nutzen, um Programmen den Zugang zu Webinhalten zu ermöglichen, und steht in der Regel im Gegensatz zu SOAP-basierten Webdiensten, die lediglich Dienste im Stil von Remote Procedure Calls in HTTP-Anfragen und -Antworten tunneln.
REST organisiert eine Webanwendung in "Ressourcen" (wie einen Twitter-Benutzer oder ein Flickr-Bild) und verwendet dann die HTTP-Verben POST, PUT, GET und DELETE, um diese Ressourcen zu erstellen, zu aktualisieren, zu lesen und zu löschen.
Idempotenz spielt bei REST eine wichtige Rolle. Wenn Sie eine Darstellung einer REST-Ressource abrufen (z. B. ein jpeg-Bild von Flickr abrufen) und der Vorgang fehlschlägt, können Sie den Abruf einfach so lange wiederholen, bis der Vorgang erfolgreich ist. Für den Webdienst spielt es keine Rolle, wie oft das Bild abgerufen wird. Wenn Sie einen RESTful-Webdienst verwenden, um Ihre Twitter-Kontoinformationen zu aktualisieren, können Sie die neuen Informationen so oft PUTen, wie es nötig ist, um eine Bestätigung vom Webdienst zu erhalten. Tausendmaliges PUT ist dasselbe wie einmaliges PUT. In ähnlicher Weise ist das tausendmalige Löschen einer REST-Ressource dasselbe wie das einmalige Löschen. Idempotenz macht es also viel einfacher, einen Webdienst zu konstruieren, der gegen Kommunikationsfehler resistent ist.
Lesen Sie weiter: RESTful Webdienste von Richardson und Ruby (Idempotenz wird auf Seite 103-104 erörtert), und Roy Fieldings Dissertation über REST . Fielding war einer der Autoren von HTTP 1.1, RFC-2616, der über Idempotenz in Abschnitt 9.1.2 .
Idempotenz bedeutet, dass die einmalige oder mehrmalige Anwendung einer Operation die gleiche Wirkung hat.
Beispiele:
- Multiplikation mit Null. Egal, wie oft man es macht, das Ergebnis ist immer noch Null.
- Setzen eines booleschen Flags. Egal, wie oft Sie es tun, das Flag bleibt gesetzt.
- Löschen einer Zeile aus einer Datenbank mit einer bestimmten ID. Wenn Sie es erneut versuchen, ist die Zeile immer noch weg.
Para reine Funktionen (Funktionen ohne Nebeneffekte), dann impliziert Idempotenz, dass f(x) = f(f(x)) = f(f(f(x))) = f(f(f(f(x)))) = ...... für alle Werte von x
Para Funktionen mit Nebeneffekten Idempotenz bedeutet darüber hinaus, dass nach der ersten Anwendung keine weiteren Nebenwirkungen auftreten. Sie können den Zustand der Welt als einen zusätzlichen "versteckten" Parameter der Funktion betrachten, wenn Sie möchten.
Beachten Sie, dass in einer Welt, in der gleichzeitige Aktionen stattfinden, Operationen, von denen Sie dachten, sie seien idempotent, nicht mehr idempotent sein können (z. B. könnte ein anderer Thread den Wert des booleschen Flags im obigen Beispiel zurücksetzen). Grundsätzlich müssen Sie bei Gleichzeitigkeit und veränderlichen Zuständen sehr viel sorgfältiger über die Idempotenz nachdenken.
Idempotenz ist oft eine nützliche Eigenschaft beim Aufbau robuster Systeme. Wenn beispielsweise die Gefahr besteht, dass Sie eine doppelte Nachricht von einem Dritten erhalten, ist es hilfreich, wenn der Nachrichtenhandler als idempotenter Vorgang fungiert, so dass die Nachricht nur einmal auftritt.
Ein gutes Beispiel für das Verständnis eines idempotenten Vorgangs wäre das Abschließen eines Autos mit einem ferngesteuerten Schlüssel.
log(Car.state) // unlocked
Remote.lock();
log(Car.state) // locked
Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked
lock
ist eine idempotente Operation. Auch wenn es jedes Mal, wenn Sie die Operation ausführen, einige Nebeneffekte gibt lock
Das Fahrzeug ist immer noch in demselben verriegelten Zustand, egal wie oft Sie den Verriegelungsvorgang ausführen.
- See previous answers
- Weitere Antworten anzeigen