Frage

Ich suche ein Befehlsmuster Unterstützung Undo / Redo in meiner Anwendung zu implementieren. Die Daten sind sehr eng miteinander verbunden, so gibt es einige Downstream Folgen von einigen meiner Objekte geändert wird, möchte ich auch in der Lage sein, rückgängig zu machen. Mein Hauptanliegen ist, wo ich den Code setzen sollte, dass die Downstream-Befehle ausführt. Zum Beispiel:

class:MoveObjectCommand
{
    private hierarchicalObject:internalObject;

    public MoveObjectCommand(hierarchicalObject:newObject)
    {
        internalObject = newObject;
    }

    public Execute()
    {
        internalObject.Location = someNewLocation;

        foreach(hierarchicalObject:child in internalObject.Children)
        {
            if(someNewLocation = specialPlace)
            {
                var newCommand:MoveObjectCommand = new MoveObjectCommand(child)

                CommandManager.add(newCommand);
            }
        }

    }

    public Undo()
    {
        internalObject.location = oldLocation;
    }
}

Soweit ich das beurteilen kann, so etwas wie dies wäre gut funktionieren, aber ich kann meinen Kopf nicht umschlingen, wo die Mehrheit des Ausführungscode soll eigentlich gehen. Sollte der hierarchicalObject eine .changeLocation () -Methode, die alle nachfolgenden Befehle hinzufügt, oder sollten sie in dem Befehl selbst sein, wie es oben ist? Der einzige Unterschied, den ich denken kann, ist, dass in dem obigen Beispiel würde die MoveObjectCommand für spätere Änderungen Prozess aufgerufen werden muß, während die andere Art und Weise es, ohne dass ein Befehl aufgerufen werden kann und immer noch die gleiche Art und Weise verarbeitet werden (könnte negative Folgen zur Nachführung Undo / Redo-Schritte). Bin Grübeln ich das? Wo würden Sie es nennen, und warum (natürlich in diesem Beispiel trifft nicht alle Winkel, aber keine allgemeine Best Practices mit dem Befehl Muster?).

War es hilfreich?

Lösung

klingt wie Sie die changeLocation () -Methode in das Modell haben sollte (hierarchicalObject i vermuten). speichert nur den neuen Standort und das Objekt in dem Befehl.

für Undo / Redo Sie eine Liste oder zwei Befehle benötigen.

klingen wie Ihr hierarchicalObject sein kann ein http://en.wikipedia.org/wiki/Composite_pattern, haben so einen in dem Gang-of-Four Buch einen Blick auf dem Makrobefehl nehmen. auch Kritik:. http://en.wikipedia.org/wiki/Command_pattern

Christopher Alexander sagt: „Jedes Muster ein Problem beschreibt, die immer und immer wieder in unserer Umgebung auftritt, und beschreibt dann den Kern der Lösung dieses Problems, so dass Sie diese Lösung millionenfach verwenden können, ohne jemals die gleiche Weise zweimal“zu tun.

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