Philosophie hinter dem Erinnerungsmuster

9

Ich habe über Erinnerungsmuster aus verschiedenen Quellen des Internets gelesen. Unterschiedliche Informationen aus verschiedenen Quellen haben mich verwirrt darüber, warum dieses Muster tatsächlich benötigt wird.

Die dofactory- Implementierung besagt, dass die Hauptabsicht dieses Musters darin besteht, den Zustand des Systems wiederherzustellen.

Wiki sagt, dass die primäre Absicht darin besteht , die Änderungen auf dem System wiederherstellen zu können . Dies hat eine andere Auswirkung: Es ist möglich, dass ein System eine Erinnerungsimplementierung hat, ohne dass eine Wiederherstellung erforderlich ist. Und diese Fähigkeit zur Wiederherstellung ist ein Merkmal davon.

OODesign sagt das

Manchmal ist es erforderlich, den internen Status eines Objekts zu einem bestimmten Zeitpunkt zu erfassen und das Objekt später wieder in diesen Status zu versetzen. Ein solcher Fall ist nützlich bei Fehlern oder Ausfällen.

Meine Frage ist also, warum genau wir diese verwenden. Ist es, um frühere Zustände zu retten - oder um die Kapselung zwischen dem Hausmeister und dem Memento zu fördern? Warum ist diese Art der Einkapselung so wichtig?

Bearbeiten: Für Besucher, überprüfen Sie diese Implementierung!

Bearbeiten : Ich arbeite an der Implementierung einer Erinnerungslösung für mein Problem. Ich werde eine weitere Frage dazu posten und diese Frage mit dieser verknüpfen. Vielen Dank für Ihre Antwort mit wertvollen Vorschlägen!

Edit 3 : Hier ist der Link zu meiner Beispielimplementierung

TheSilverBullet
quelle

Antworten:

2

Ein ähnliches Muster, Memo oder Memoization, speichert auch den Status, wird jedoch häufig als Optimierung der Programmgeschwindigkeit verwendet. Wenn eine zeitaufwändige Operation eine begrenzte Anzahl gemeinsamer Ein- und Ausgänge hat, können die häufigsten (oder alle) in einer Hashtabelle gespeichert werden. Beim erneuten Aufruf mit denselben Eingaben wird zuerst die Hashtabelle überprüft. Wenn sie gefunden wird, wird die vorherige Ausgabe zurückgegeben, ohne sie neu zu berechnen.

Ich stelle mir vor, dass ein Memento-Muster auch für die Leistung verwendet werden könnte - anstatt alle umgekehrten Berechnungen für eine Änderung des umgekehrten Zustands durchzuführen, stellen Sie einfach den vorherigen Zustand wieder her. Einige Funktionen sind einseitig, daher gibt es kein Rückgängigmachen, es sei denn, Sie speichern den vorherigen Status.

Sie können ein Memento-Muster verwenden, um eine periodische oder symmetrische Funktion wie Sinus zu speichern. Berechnen Sie alle Werte von 0 bis 180 Grad und gehen Sie sie dann rückwärts durch, um die negativen Werte von 180 bis 360 zu erhalten. Besser noch, berechnen Sie Werte von 0 bis 90 und gehen Sie diese Werte dann rückwärts durch, um 90 bis 180 zu erhalten, vorwärts für 180 bis 270 und rückwärts von 270 bis 360.

Strg-Z in Word oder die Rückgängig-Funktion einer Software wird wahrscheinlich mithilfe des Erinnerungsmusters oder in einigen Fällen möglicherweise durch Umkehrung der Funktion implementiert, die jede Änderung vorgenommen hat. Im zweiten Fall wäre die Historie, deren Funktionen aufgerufen wurden, Andenken, daher wird das Andenkenmuster vermutlich immer zum Rückgängigmachen verwendet.

GlenPeterson
quelle
Speichermuster zur Vermeidung von Rückrechnungen und für periodische Funktionen - danke für diese Info! Nichts wie ein praktisches Beispiel, um die Konzepte zum Eintauchen zu bringen!
TheSilverBullet
Es kann auch mit etwas wie Newtons Methode zur Quadratwurzelnäherung verwendet werden, um zu entscheiden, wann Sie fertig sind. mitpress.mit.edu/sicp/full-text/book/… Da die zugrunde liegende Gleitkommadarstellung nur eine begrenzte Genauigkeit aufweist, weisen alle Zahlen möglicherweise wiederholte Annäherungen auf. Wenn Sie wissen, was die alten Näherungen waren, können Sie die Annäherung beim ersten Wiederholen einer Antwort beenden und maximale Genauigkeit erzielen (auf Kosten von Zeit und Speicher).
GlenPeterson
8

An sich wird das Erinnerungsmuster nur zum Erfassen und Speichern von Zuständen verwendet. Die Kapselung dient nur zum Schutz der Zustände vor dem Rest des Systems. Sobald ein Zustand erfasst wurde, muss er sorgfältig kontrolliert werden. Zum Beispiel ist es nicht sinnvoll, einen vorherigen Status nach dem Speichern ändern zu können (dies würde den Verlauf ändern), und es ist möglicherweise nicht sinnvoll, einfach zu einem vorherigen Status eines Objekts zurückzukehren, ohne andere zu beeinflussen (um dies zu verhindern) das System kann nicht vollständig ungültig werden).

Die häufigste Verwendung eines Memento, die ich gesehen habe, ist die Unterstützung der Rückgängig-Funktionalität. Es bezieht sich auch auf das Speichern von Wiederherstellungsfunktionen, indem Sie in der Zeit zurückgehen.

Thomas Owens
quelle
Ich habe es auch in der Kopier- und Serialisierungslogik verwendet (um Objekte über eine Leitung zu senden oder den Status in einer Datei zu speichern).
Scott Whitlock
@ScottWhitlock Das Speichern des Status in einer Datei ist für Memento sinnvoll. Das Memento-Objekt hätte die Möglichkeit, sich selbst in ein bestimmtes Format zu schreiben und durch Lesen dieses Formats ein neues zu erstellen, während der Caretaker die Schnittstelle zum Speichern des Status in einem externen Format oder zum Laden des Status aus dem externen Format bereitstellt - es ist nur eine Erweiterung zum Speichern des Zustands im Speicher. Ich kann jedoch nicht wirklich sehen, dass es in der Kopierlogik verwendet wird. Ich müsste viel mehr darüber nachdenken.
Thomas Owens
@ThomasOwens, danke für diesen wichtigen Teil in Ihrer Erklärung, dass das Andenken im Grunde genommen "Speichern" von Zuständen ist. Es liegt im Ermessen des Implementierers, wiederherzustellen oder nicht! Ich fand diesen Teil der Erklärung in allen meinen Referenzen fehlend !!
TheSilverBullet
@ScottWhitlock, vielen Dank für den Link zu Ihrer Erinnerungsimplementierung! Ich konnte nicht nur die grundlegende Verwendung verstehen, sondern auch die intuitive Verwendung, wie Sie es getan haben!
TheSilverBullet
1

Alle diese Definitionen lenken Sie in die gleiche Richtung. Sie alle sagen, es gehe darum, etwas in seinen vorherigen Zustand zurückversetzen zu können. Das kann das gesamte System oder nur ein einzelnes Objekt sein.

Dieses Muster ist nützlich, wenn sich der Status eines Datensatzes im Laufe der Zeit ändert, Sie jedoch die geschäftliche Anforderung haben, ihn jederzeit in einen früheren Status zurückversetzen zu können. Oder alternativ, wenn Sie den Datensatz so anzeigen möchten, wie er zu einem früheren Zeitpunkt war. Diese Art von Anforderungen ist in vielen Arten von Systemen sehr verbreitet.

hvgotcodes
quelle