2011-01-06 18 views
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; 
    } 
} 

私の知る限り、このようなものは、罰金に動作しますが、私は実行コードの大半は、実際に行くべき場所のまわりで私の頭をラップすることはできません。 hierarchicalObjectには後続のすべてのコマンドを追加する.changeLocation()メソッドが必要ですか、それともコマンド自体に上記のように記述する必要がありますか?私が考えることができる唯一の違いは、上記の例では、MoveObjectCommandを後続のプロセス変更のために呼び出す必要がありますが、コマンドを必要とせずに呼び出すことができ、同じ方法を処理することができます(否定的な結果取り消し/やり直しの手順を追跡するため)。私はこれを熟考していますか?あなたはどこにそれを置くのでしょうか(なぜなら、この例はすべての角度に当てはまるわけではありませんが、コマンドパターンの一般的なベストプラクティスですか?)。

答えて

2

あなたはmodel(hierarchicalObject i presume)でchangeLocation()メソッドを持っているはずです。新しい位置とオブジェクトをコマンドに格納するだけです。

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

あなたのhierarchicalObjectのようなサウンドはhttp://en.wikipedia.org/wiki/Composite_patternである可能性がありますので、gang-of-four書籍のマクロコマンドを見てください。レビュー:http://en.wikipedia.org/wiki/Command_pattern

クリストファーアレクサンダーは、「各パターンは、私たちの環境で何度も繰り返し発生する問題を記述し、その解決策の核心を何百万回も使用できるように説明しています、同じことを二度もやることはありません "。

+0

ええ、私はそれについて少し考えた後も同様に考え始めています。コードがコマンドオブジェクト内にある場合、階層オブジェクトを変更してコマンド履歴を保存できないことを意味します。 – Ocelot20

関連する問題