Antworten:
Beim Rechnen ist eine idempotente Operation eine Operation, die keine zusätzlichen Auswirkungen hat, wenn sie mehrmals mit denselben Eingabeparametern aufgerufen wird. Das Entfernen eines Elements aus einem Satz kann beispielsweise als idempotente Operation am Satz angesehen werden.
In der Mathematik ist eine idempotente Operation eine, bei der f (f (x)) = f (x) ist . Zum Beispiel ist die abs()
Funktion weil abs(abs(x)) = abs(x)
für alle idempotent x
.
Diese leicht unterschiedlichen Definitionen können miteinander in Einklang gebracht werden, indem berücksichtigt wird, dass x in der mathematischen Definition den Zustand eines Objekts darstellt und f eine Operation ist, die dieses Objekt mutieren kann. Betrachten Sie beispielsweise Pythonset
und seine discard
Methode. Die discard
Methode entfernt ein Element aus einer Menge und führt nichts aus, wenn das Element nicht vorhanden ist. Damit:
my_set.discard(x)
hat genau den gleichen Effekt wie zweimal dieselbe Operation:
my_set.discard(x)
my_set.discard(x)
Idempotente Operationen werden häufig beim Entwurf von Netzwerkprotokollen verwendet, bei denen eine Anforderung zur Ausführung einer Operation garantiert mindestens einmal, aber auch mehrmals auftreten kann. Wenn die Operation idempotent ist, kann es nicht schaden, die Operation zwei- oder mehrmals auszuführen.
Weitere Informationen finden Sie im Wikipedia-Artikel über Idempotenz .
Die obige Antwort hatte zuvor einige falsche und irreführende Beispiele. Die vor April 2014 verfassten Kommentare beziehen sich auf eine ältere Revision.
set
Beispiel in der Antwort hat das gesetzte Objekt eindeutig den Status und bietet auch einige idempotente Operationen wie discard
.
discard
kann auch zustandslos implementiert werden, indem der Status in den Rückgabewert einbezogen wird : discard([my_set, x]) = [my_new_set, x]
. So können Sie tun discard(discard([my_set, x]))
. Beachten Sie, dass [my_new_set, x]
ist nur ein Argument und seine Art ist 2-fach.
discard(x)
enthält nicht mehr Der Satz: ein zweites Mal die gleiche Wirkung haben , da es das erste Mal aufrufen x
. Bei der Berechnung der Idempotenz geht es um die Robustheit eines Systems. Wie können Sie sich erholen, wenn ein Fehler erkannt wird (z. B. Netzwerkausfall)? Die einfachste Wiederherstellung besteht darin, es einfach noch einmal zu tun, aber das funktioniert nur, wenn es idempotent ist. ZB discard(x)
ist idempotent, aber pop()
nicht. Es geht nur um die Fehlerbehebung.
Eine idempotente Operation kann beliebig oft wiederholt werden, und das Ergebnis ist das gleiche, als wäre es nur einmal ausgeführt worden. In der Arithmetik ist das Hinzufügen von Null zu einer Zahl idempotent.
Über Idempotenz wird im Zusammenhang mit "RESTful" -Webdiensten viel gesprochen. REST versucht, HTTP maximal zu nutzen, um Programmen Zugriff auf Webinhalte zu gewähren, und wird normalerweise im Gegensatz zu SOAP-basierten Webdiensten festgelegt, die nur Dienste im Stil von Remoteprozeduraufrufen in HTTP-Anforderungen und -Antworten tunneln.
REST organisiert eine Webanwendung in "Ressourcen" (wie ein 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 erhalten (z. B. ein JPEG-Bild von Flickr abrufen) und der Vorgang fehlschlägt, können Sie den GET einfach immer wieder 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 zum Aktualisieren Ihrer Twitter-Kontoinformationen verwenden, können Sie die neuen Informationen auch so oft wie nötig eingeben, um eine Bestätigung vom Webdienst zu erhalten. Tausendmaliges Setzen ist dasselbe wie einmaliges Putten. In ähnlicher Weise entspricht das tausendmalige Löschen einer REST-Ressource dem einmaligen Löschen. Idempotenz erleichtert somit die Erstellung eines Webdienstes, der gegenüber Kommunikationsfehlern widerstandsfähig ist.
Weiterführende Literatur: RESTful Web Services von Richardson und Ruby (Idempotenz wird auf Seite 103-104 beschrieben) und Roy Fieldings Dissertation über REST . Fielding war einer der Autoren von HTTP 1.1, RFC-2616, der in Abschnitt 9.1.2 über Idempotenz spricht .
Unabhängig davon, wie oft Sie die Operation aufrufen, ist das Ergebnis dasselbe.
truncate
und delete
.
Idempotenz bedeutet, dass das einmalige oder mehrfache Anwenden einer Operation den gleichen Effekt hat.
Beispiele:
Für reine Funktionen (Funktionen ohne Nebenwirkungen) impliziert Idempotenz, dass f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... für alle Werte von x
Bei Funktionen mit Nebenwirkungen bedeutet Idempotenz außerdem, dass nach der ersten Anwendung keine zusätzlichen Nebenwirkungen verursacht werden. Sie können den Zustand der Welt als zusätzlichen "versteckten" Parameter für die Funktion betrachten, wenn Sie möchten.
Beachten Sie, dass in einer Welt, in der gleichzeitig Aktionen ausgeführt werden, möglicherweise keine Operationen mehr ausgeführt werden, die Sie für idempotent hielten (z. B. könnte ein anderer Thread den Wert des Booleschen Flags im obigen Beispiel deaktivieren). Grundsätzlich müssen Sie, wenn Sie Parallelität und veränderlichen Zustand haben, viel genauer über Idempotenz nachdenken.
Idempotenz ist oft eine nützliche Eigenschaft beim Aufbau robuster Systeme. Wenn beispielsweise das Risiko besteht, dass Sie eine doppelte Nachricht von einem Drittanbieter erhalten, ist es hilfreich, den Nachrichtenhandler als idempotente Operation zu verwenden, damit der Nachrichteneffekt nur einmal auftritt.
f(x) = f(f(x))
, meinen Sie, dass dies f(x){return x+1;}
keine reine Funktion ist? weil f(x) != f(f(x))
: f(1)
gibt 2, während f(2)
gibt 3.
f(x) = f(f(x))
. Aber wie @GregHewgill erwähnt hat, müssen Sie, damit diese Definition Sinn macht, x
als Objekt und f
als Operation betrachten, die den Zustand des Objekts mutiert (dh die Ausgabe von f
ist mutiert x
).
Eine idempotente Operation erzeugt das Ergebnis im selben Zustand, auch wenn Sie es mehrmals aufrufen, vorausgesetzt, Sie übergeben dieselben Parameter.
Ich wollte nur einen echten Anwendungsfall rauswerfen, der Idempotenz demonstriert. Angenommen, Sie definieren in JavaScript eine Reihe von Modellklassen (wie im MVC-Modell). Die Art und Weise, wie dies häufig implementiert wird, entspricht funktional so etwas (grundlegendes Beispiel):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
Sie können dann neue Klassen wie folgt definieren:
var User = model('user');
var Article = model('article');
Aber wenn Sie versuchen würden, die User
Klasse model('user')
von irgendwo anders im Code zu erhalten, würde dies fehlschlagen:
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
Diese beiden User
Konstruktoren wären unterschiedlich. Das ist,
model('user') !== model('user');
Um es idempotent zu machen , fügen Sie einfach eine Art Caching-Mechanismus hinzu, wie folgt:
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
Wenn Sie Caching hinzufügen, ist es jedes Mal model('user')
dasselbe Objekt, und daher ist es idempotent. Damit:
model('user') === model('user');
Eine idempotente Operation ist eine Operation, Aktion oder Anforderung, die mehrmals angewendet werden kann, ohne das Ergebnis, dh den Status des Systems, über die ursprüngliche Anwendung hinaus zu ändern.
BEISPIELE (WEB APP CONTEXT):
IDEMPOTENT: Das Erstellen mehrerer identischer Anforderungen hat den gleichen Effekt wie das Erstellen einer einzelnen Anforderung. Eine Nachricht in einem E-Mail-Nachrichtensystem wird geöffnet und in der Datenbank als "geöffnet" markiert. Man kann die Nachricht viele Male öffnen, aber diese wiederholte Aktion führt immer nur dazu, dass sich diese Nachricht im "geöffneten" Zustand befindet. Dies ist eine idempotente Operation. Wenn Sie zum ersten Mal eine Aktualisierung einer Ressource unter Verwendung von Informationen durchführen, die nicht mit der Ressource (dem Status des Systems) übereinstimmen, ändert sich der Status des Systems, wenn die Ressource aktualisiert wird. Wenn ein PUT dasselbe Update wiederholt an eine Ressource sendet, stimmen die Informationen im Update mit den Informationen überein, die sich bei jedem PUT bereits im System befinden, und es erfolgt keine Änderung des Systemstatus. Wiederholte PUTs mit denselben Informationen sind idempotent:
NON-IDEMPOTENT: Wenn eine Operation immer eine Statusänderung verursacht, z. B. das wiederholte Versenden derselben Nachricht an einen Benutzer, was dazu führt, dass jedes Mal eine neue Nachricht gesendet und in der Datenbank gespeichert wird, wird die Operation als NON-IDEMPOTENT bezeichnet.
NULLIPOTENT: Wenn eine Operation keine Nebenwirkungen hat, z. B. das reine Anzeigen von Informationen auf einer Webseite ohne Änderung in einer Datenbank (mit anderen Worten, Sie lesen nur die Datenbank), wird die Operation als NULLIPOTENT bezeichnet. Alle GETs sollten nullipotent sein.
Wenn wir über den Zustand des Systems sprechen, ignorieren wir offensichtlich hoffentlich harmlose und unvermeidliche Effekte wie Protokollierung und Diagnose.
Idempotente Operationen: Operationen, die keine Nebenwirkungen haben, wenn sie mehrmals ausgeführt werden.
Beispiel : Eine Operation, die Werte aus einer Datenressource abruft und diese beispielsweise druckt.
Nicht-dempotente Operationen: Operationen, die bei mehrmaliger Ausführung Schaden anrichten würden. (Da sie einige Werte oder Zustände ändern)
Beispiel: Eine Operation, die von einem Bankkonto abgebucht wird
Ziemlich detaillierte und technische Antworten. Fügen Sie einfach eine einfache Definition hinzu.
Idempotent = Wiederholbar
Beispielsweise kann Create
nicht garantiert werden , dass die
Operation an sich fehlerfrei ausgeführt wird, wenn sie mehrmals ausgeführt wird. Wenn es jedoch eine Operation gibt, wird die CreateOrUpdate
Wiederholbarkeit (Idempotenz) angegeben.
Eine idempotente Operation über eine Menge lässt ihre Mitglieder unverändert, wenn sie einmal oder mehrmals angewendet wird.
Es kann eine unäre Operation wie Absolut (x) sein, bei der x zu einer Menge positiver Ganzzahlen gehört. Hier ist absolut (absolut (x)) = x.
Es kann eine binäre Operation sein, bei der die Vereinigung einer Menge mit sich selbst immer dieselbe Menge zurückgibt.
Prost
Es ist jede Operation, bei der jedes n-te Ergebnis zu einer Ausgabe führt, die dem Wert des ersten Ergebnisses entspricht. Zum Beispiel ist der Absolutwert von -1 1. Der Absolutwert des Absolutwerts von -1 ist 1. Der Absolutwert des Absolutwerts des Absolutwerts von -1 ist 1. Und so weiter.
Siehe auch: Wann wäre eine wirklich dumme Zeit, um Rekursion zu verwenden?
Ein gutes Beispiel für das Verständnis einer idempotenten Operation könnte das Sperren eines Autos mit einem Fernschlüssel sein.
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. Selbst wenn bei jedem lock
Fahren Nebenwirkungen auftreten , wie z. B. Blinken, befindet sich das Auto immer noch im selben gesperrten Zustand, unabhängig davon, wie oft Sie den Sperrvorgang ausführen.
my 5c: Bei der Integration und Vernetzung ist die Idempotenz sehr wichtig. Einige Beispiele aus der Praxis: Stellen Sie sich vor, wir liefern Daten an das Zielsystem. Daten, die von einer Folge von Nachrichten geliefert werden. 1. Was würde passieren, wenn die Sequenz im Kanal gemischt wird? (Wie Netzwerkpakete immer :)). Wenn das Zielsystem idempotent ist, ist das Ergebnis nicht anders. Wenn das Zielsystem von der richtigen Reihenfolge in der Sequenz abhängt, müssen wir einen Resequencer am Zielstandort implementieren, der die richtige Reihenfolge wiederherstellen würde. 2. Was würde passieren, wenn die Nachricht doppelt vorhanden wäre? Wenn der Kanal des Zielsystems nicht rechtzeitig bestätigt, sendet das Quellsystem (oder der Kanal selbst) normalerweise eine weitere Kopie der Nachricht. Infolgedessen können auf der Zielsystemseite doppelte Nachrichten angezeigt werden. Wenn das Zielsystem idempotent ist, es kümmert sich darum und das Ergebnis wird nicht anders sein. Wenn das Zielsystem nicht idempotent ist, müssen wir den Deduplikator auf der Zielsystemseite des Kanals implementieren.
Kurz gesagt , Idempotente Operationen bedeuten, dass die Operation nicht zu unterschiedlichen Ergebnissen führt, unabhängig davon, wie oft Sie die idempotenten Operationen ausführen.
Zum Beispiel sind gemäß der Definition der Spezifikation von HTTP GET, HEAD, PUT, and DELETE
idempotente Operationen; jedoch POST and PATCH
ist es nicht. Deshalb wird manchmal POST
durch ersetzt PUT
.
Wiederholungssicher.
Ist normalerweise der einfachste Weg, seine Bedeutung in der Informatik zu verstehen.
Idempotent operations are often used in the design of network protocols
hier ein verwandtes Beispiel ist ** GET soll nichts auf dem Server ändern, also ist GET idempotent. Im HTTP / Servlet-Kontext bedeutet dies, dass dieselbe Anforderung zweimal ohne negative Konsequenzen gestellt werden kann. ** POST ist NICHT idempotent.