mikrocontroller.net

Forum: PC-Programmierung Undo/Redo-Konzept


Autor: Dieter L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich bin auf der Suche nach einem Ansatz/Konzept, wie man 
Undo/Redo-Funktionalität in eine PC-Software (bei mir C#) einbindet.

Kennt jemand eine schöne Webseite/Buch/Beschreibung wie man sowas 
allgemein löst? Auch gegenüber Stichwörtern bin ich aufgeschlossen.

Ganz prinzipiell habe ich mir davon schon eine Vorstellung gebildet. So 
ganz im Stile von einem Stack, der mit Aktionen/Methoden 
(UndoAction/RedoAction) beladen wird und die dann der Reihe nach vor und 
zurück ausgeführt werden. Wenn nur eine einzelne Art von Aktion 
rückgängig gemacht werden soll, dann ists ja trivial. Wenn aber 
verschiedenste Benutzeraktionen umkehrbar sein sollen, steige ich aus. 
:-)

Beispiel Zeichenprogramm: Immer nur die letzten Pinselstriche rückgängig 
machen ist mir noch klar. Wenn dann aber zwischendurch eine neue Ebene 
eingefügt wird, dann darauf gezeichnet wird, dann z.B. das Bild komplett 
gelöscht wird... das sind ja alles unterschiedlichste Aktionen, die auf 
ganz unterschiedliche Objekte/Datenstrukturen angewandt werden. Dennoch 
müssen diese auf eine Gemeinsamkeit (Schnittstelle?) heruntergebrochen 
werden können, die dann auf den Undo/Redo-Stack gelegt werden. Wie geht 
man da vor?

Danke.

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Schau dir mal das Command Pattern von 
http://www.mycsharp.de/wbb2/thread.php?threadid=21273 an.

Autor: Dieter L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Chris E.,

danke, das ist genau der Anstoss, den ich gesucht hatte. Prima.

Autor: Stephan M. (stephanm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

eine Alternative zum Command-Pattern bei Verwendung von MVC ist, die 
Events deines Models mit einer Undo/Redo-Schnittstelle auszustatten, 
siehe unten.

Je nach konkreter Aufgabenstellung kann eine Realisierung des 
Command-Patterns äußerst ekelhaft werden, da speziell bei komplexen 
Modellen die notwendigen Verknüpfungen zwischen Model und Command die 
"Separation of concerns"-Idee gegen die Wand fahren. Klar, man kann um 
alles herumprogrammieren aber irgendwann ists halt nicht mehr lustich.

Üblicherweise sendet ein Model ja Events an interessierte Parteien, um 
über Änderungen seiner Daten zu berichten. Die Events enthalten demnach 
in natürlicher Weise bereits die Daten eines atomaren Deltas, d.h. eine 
"Vorher-Nachher-Information". Man kann nun die Event-Klassen zusätzlich 
mit einer Undo/Redo-Funktion ausstatten - die Daten für die 
Undo/Redo-Schritte kapseln sie ja bereits, es fehlt also nur noch das 
Verhalten.

Das schöne an diesem Ansatz ist, dass das Model ja sowieso Herr über die 
generierten Events und damit auch Herr über die verwendete 
Implementierung der Event-Klassen ist. Ergo kann das "Redoable 
Event"-Pattern im Model-Bereich einfacher zu einer geschlossenen Einheit 
führen als dies gelegentlich mit dem Command-Pattern möglich ist, denn 
die Commands werden typischerweise ausserhalb des Models erzeugt.

Das Verfahren hat aber auch eine Reihe von Nachteilen, leider teilweise 
auch genau die, die man beim klassischen Command-Pattern auch hat.

Beispiel Speicherverbrauch: es laufen typischerweise viele "kleine" 
Events in der Undo/Redo-Queue auf. Mit einem Analogon der beim 
Command-Pattern gebräuchlichen "Command Compression" (Zusammenführen 
gleichartiger Commands zu einer Objektinstanz) lässt sich das aber 
möglicherweise gut in den Griff bekommen.

Liebe Grüße,

Stephan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.