9

コマンドパターンを使用して、アプリケーションに元に戻す/やり直し機能を実装しようとしています。私は問題に直面しています。

それを説明するために、私のアプリケーションで2Dプロファイルを(必要な数だけ)作成できると想像してみましょう。

これらの2Dプロファイルから、さまざまな属性(名前、色、スケールなど)を持つ3Dパーツを作成できます。

+--------------+              +--------------+      +--------------+
| 2D profile A |              | 2D profile B |      | 2D profile C |
+--------------+              +--------------+      +--------------+
   |    |                            |
   |  +---------------+      +---------------+
   |  | 3D Part B     |      | 3D Part C     |
   |  | Colour : blue |      | Colour : grey |
   |  | Name : bibi   |      | Name : foo    |
   |  | Scale : 33%   |      | Scale : 100%  |
   |  +---------------+      +---------------+
+--------------+
| 3D Part A    |
| Colour : red |
| Name : aaa   |
| Scale : 50%  |
+--------------*

プロファイルが削除されると、このプロファイルに基づいて構築されたすべての3Dパーツも自動的に削除されます(プロファイルが削除されようとすると、3Dパーツマネージャーに通知され、廃止された3Dパーツが削除されます。ビューにも通知されて更新されます。 GUI)。

これは私が問題に直面しているところです:私は2Dプロファイルを削除するためのundo / redoコマンドを書いています、それはこのように見えます(擬似コード):

virtual void redo()
{
    m_pProfileList.remove(m_pProfile); // This will automatically delete all 3D parts relying on the deleted 2D profile
}

virtual void undo()
{
   m_pProfileList.add(m_pProfile); // This will add the 2D profile, but the 3D Parts are lost
}

上記のコードでわかるように、2Dプロファイルを削除すると、削除されたプロファイルに依存するすべての3Dパーツが自動的に削除されます。

ただし、元に戻す場合は、2Dプロファイルをリストに再度追加するだけでは不十分です。3Dパーツが失われます。

私は何をすべきか ?undo / redoコマンドは、3Dパーツの削除を処理する責任がありますか(これは、3Dパーツマネージャーによって実際に行われることです)?これは、undo/redoコマンドがGUIを更新するようにビューに通知する役割も担うことを意味します。

または、undo / redoコマンドで、削除されるすべての3Dパーツの内部コピーを作成し、3Dパーツマネージャーに3Dパーツを削除させる必要がありますか?

または、別のより良い解決策はありますか?

ご協力いただきありがとうございます !

4

1 に答える 1

1

これを少し変えて、Memento patternが必要です。完全なオブジェクト ツリーのスナップショットを保存するか、変更ごとにすべての違いだけを保存します。この一連の変更履歴を利用して、依存オブジェクトを失うことなく、心ゆくまでコマンドを使用して前後に移動できます。

于 2009-01-12T16:28:17.237 に答える