2

アプリケーションで元に戻す/やり直しをサポートするコマンド パターンを実装しようとしています。データは非常に密接に結びついているため、元に戻したいオブジェクトの一部を変更すると、ダウンストリームの結果が生じます。私の主な関心事は、ダウンストリーム コマンドを実行するコードをどこに置くべきかということです。例えば:

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;
    }
}

私が知る限り、このようなものは問題なく機能しますが、実行コードの大部分が実際にどこに行くべきかについて頭を悩ませることはできません。hierarchyObject には、後続のすべてのコマンドを追加する .changeLocation() メソッドが必要ですか、それとも上記のようにコマンド自体に含める必要がありますか? 私が考えることができる唯一の違いは、上記の例では、MoveObjectCommand を呼び出して後続の変更を処理する必要があるのに対し、別の方法ではコマンドを必要とせずに呼び出して同じ方法で処理することができるということです (マイナスの結果をもたらす可能性があります)。元に戻す/やり直しの手順を追跡するため)。私はこれを考えすぎていますか?どこに、なぜそれを配置しますか (明らかに、この例はすべての角度にヒットするわけではありませんが、コマンド パターンに関する一般的なベスト プラクティスはありますか?)。

4

1 に答える 1

2

モデルに changeLocation() メソッドが必要なようですね (hierarchicalObject だと思います)。コマンドに新しい場所とオブジェクトを保存するだけです。

元に戻す/やり直すには、コマンドのリストが 1 つまたは 2 つ必要です。

hierarchyObject がhttp://en.wikipedia.org/wiki/Composite_patternのように聞こえるので、ギャング オブ フォーの本のマクロ コマンドを見てください。http://en.wikipedia.org/wiki/Command_patternも確認してください。

Christopher Alexander は次のように述べています。同じように2回」。

于 2011-01-06T18:04:02.573 に答える