Was ist eine idempotente Operation?
Antworten
Zu viele Anzeigen?Eine idempotente Operation ist eine Operation, Aktion oder Anforderung, die mehrfach angewendet werden kann, ohne dass sich das Ergebnis, d. h. der Zustand des Systems, über die erste Anwendung hinaus ändert.
BEISPIELE (WEB-APP-KONTEXT):
IDEMPOTENT: Mehrere identische Anträge haben die gleiche Wirkung wie ein einziger Antrag. 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 wird immer nur dazu führen, dass sich die Nachricht im Zustand "geöffnet" befindet. Dies ist ein idempotenter Vorgang. Wenn man zum ersten Mal eine Aktualisierung einer Ressource mit Informationen vornimmt, die nicht mit der Ressource (dem Zustand des Systems) übereinstimmen, wird sich der Zustand des Systems ändern, wenn die Ressource aktualisiert wird. Wenn man dieselbe Aktualisierung wiederholt an eine Ressource sendet, stimmen die Informationen in der Aktualisierung mit den Informationen überein, die bei jedem PUT bereits im System vorhanden sind, und der Zustand des Systems wird nicht verändert. Wiederholte PUTs mit denselben Informationen sind idempotent: Das erste PUT kann den Zustand des Systems ändern, nachfolgende PUTs sollten es nicht.
NICHT-IDEMPOTENT: Wenn ein Vorgang immer eine Zustandsänderung verursacht, wie z. B. das wiederholte Senden derselben Nachricht an einen Benutzer, was jedes Mal dazu führt, dass eine neue Nachricht gesendet und in der Datenbank gespeichert wird, sagen wir, dass der Vorgang NICHT IDEMPOTENT ist.
NULLIPOTENT: Wenn eine Operation keine Nebeneffekte hat, wie z.B. die reine Anzeige von Informationen auf einer Webseite ohne jegliche Änderung in einer Datenbank (mit anderen Worten, Sie lesen nur die Datenbank), sagen wir, die Operation ist NULLIPOTENT. Alle GETs sollten nullipotent sein.
Wenn wir über den Zustand des Systems sprechen, ignorieren wir natürlich die hoffentlich harmlosen und unvermeidlichen Effekte wie Protokollierung und Diagnose.
Ich wollte nur einen realen Anwendungsfall nennen, der Idempotenz demonstriert. In JavaScript, sagen wir, Sie definieren eine Reihe von Modell-Klassen (wie in MVC-Modell). Die Art und Weise dies oft implementiert ist funktional äquivalent zu etwas wie dieses (einfache Beispiel):
function model(name) {
function Model() {
this.name = name;
}
return Model;
}
Sie könnten dann neue Klassen wie diese definieren:
var User = model('user');
var Article = model('article');
Aber wenn Sie versuchen würden, die User
Klasse über model('user')
von einer anderen Stelle des Codes, würde es fehlschlagen:
var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');
Diese beiden User
Konstrukteure anders sein würden. Das heißt,
model('user') !== model('user');
Um es zu machen idempotent würde man einfach eine Art Zwischenspeicherung einrichten, etwa so:
var collection = {};
function model(name) {
if (collection[name])
return collection[name];
function Model() {
this.name = name;
}
collection[name] = Model;
return Model;
}
Durch das Hinzufügen der Zwischenspeicherung wird jedes Mal, wenn Sie model('user')
wird es dasselbe Objekt sein, also ist es idempotent. Also:
model('user') === model('user');
Ziemlich detaillierte und technische Antworten. Ich füge nur eine einfache Definition hinzu.
Idempotent = Wiederholbar
Zum Beispiel, Create
Operation an sich ist nicht garantiert, dass sie fehlerfrei läuft, wenn sie mehr als einmal ausgeführt wird. Aber wenn es eine Operation gibt CreateOrUpdate
dann wird die Wiederholbarkeit (Idempotenz) festgestellt.
Es ist eine beliebige 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 ein wirklich dummer Zeitpunkt für die Verwendung von Rekursionen?