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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top