Undo / Redo mit unveränderlichen Objekten
-
06-07-2019 - |
Frage
Ich las das folgende in einem Artikel
Unveränderliche Objekte sind besonders praktisch für bestimmte gemeinsame Umsetzung Idiome wie Undo / Redo und abbrechbare Transaktionen. Nehmen Sie zum Beispiel rückgängig machen. EIN übliche Technik für die Umsetzung Undo ist ein Stapel von Gegenständen zu halten, die irgendwie wissen, wie jeder Befehl ausgeführt werden soll in umgekehrter Richtung (die so genannte „Befehl Pattern "). Doch herauszufinden, wie laufen können einen Befehl in umgekehrter sein heikel. Eine einfachere Technik ist es, einen Stapel von unveränderlichen Objekten pflegen die den Zustand des Systems zwischen aufeinanderfolgenden Befehlen. Dann zu rückgängig machen einen Befehl, kehren Sie einfach zurück zum vorherigen Systemzustand (und wahrscheinlich speichert den aktuellen Zustand auf der Redo-Stack).
Howver, wird der Artikel nicht ein gutes praktisches Beispiel zeigen, wie unveränderliche Objekte verwendet werden könnte, zu implementieren Operationen „rückgängig machen“. Zum Beispiel ... Löschen 10 E-Mails von einem Google Mail-Posteingang. Sobald Sie das tun, hat es eine Undo-Option. Wie würde ein unveränderliches Objekt Hilfe in dieser Hinsicht?
Lösung
Die unveränderlichen Objekte würden den gesamten Zustand des Systems halten, so dass in diesem Fall würden Sie das Objekt A haben, den die ursprüngliche Posteingang enthält, und dann B-Objekt, das den Posteingang mit zehn E-Mail gelöscht enthält, und (in Kraft ) von B nach A ein Zeiger zurück angibt, dass, wenn Sie eine „rückgängig“ tun, dann stoppen Sie B als der Zustand des Systems und beginnen mit A statt.
Allerdings Gmail-Postfächer sind viel zu groß, um diese Technik zu nutzen. Sie würden es auf Dokumente verwenden, die eigentlich in einer ziemlich geringen Menge an Speicher gespeichert werden können, so dass Sie viele von ihnen um für Multi-Level-Undo halten können.
Wenn Sie zehn Ebenen der Undo behalten möchten, können Sie möglicherweise Speicher sparen, indem nur zwei unveränderliche Objekte zu halten - eine, die aktuelle ist, und eine, die von zehn „undos“ vor ist - und eine Liste der Befehle, die zwischen angewandt wurden sie.
ein „undo“ zu tun, Sie erneut ausführen, alle bis auf das letzte Objekt Command, verwendet, die als das neue aktuelle Objekt, und den letzten Befehl löscht (oder als speichern „Wiederherstellen“ Objekt). Jedes Mal, wenn Sie eine neue Aktion zu tun, aktualisieren Sie das aktuelle Objekt, fügen Sie den zugehörigen Befehl zu der Liste, und dann (wenn die Liste mehr als zehn Befehle lang ist) können Sie den ersten Befehl auf dem Objekt von Anfang an der Undo-Liste ausführen und wirft den ersten Befehl auf der Liste entfernt.
Sie können auch verschiedene andere Prüfpunkten Systeme tun, eine variable Anzahl von kompletten Darstellungen des Systems sowie eine variable Anzahl von Befehlen zwischen ihnen beteiligt ist. Aber es wird mehr und mehr von der ursprünglichen Idee, die Sie zitierten und werden mehr und mehr wie ein typisches wandelbar System. Es ist jedoch zu vermeiden, das Problem der Herstellung Befehle konsequent reversibel; Sie müssen immer nur Befehle vorwärts auf ein Objekt anwenden und nicht umgekehrt.
SVN und andere Versionskontrollsysteme sind effektiv eine Scheiben- oder netzwerkbasierte Form des Undo-und-Redo.