- PR -

Undo/Redo機能の実装について

1
投稿者投稿内容
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2004-09-24 10:46
お世話になってます。

現在、VB.NETで販売管理ソフトを作ろうとしています。
で、そのソフトにUndo/Redo機能を実装したいと思っています。

ソフトとしては、MDIウィンドウで、受注や見積など多種のウィンドウが同時に開けて
見積などの画面には、テキストボックスなどが並んでいるヘッダ部、グリッドで構成
されている明細部などがあります。

こういったソフトでUndo/Redo機能を実装しようとすると大変だと思うのですが、Undo/
Redo実装の基本概念など御存知の方おられませんでしょうか?
デザインパターンでMementoパターンがあるようですが、今回のような複雑なパターン
ではできるのかどうかがわかりません。

考え方や概念などを説明している書籍やホームページなどご存知の方おられましたら
お願いします。


てっく
常連さん
会議室デビュー日: 2002/11/05
投稿数: 28
投稿日時: 2004-09-24 11:31
てっくと申します。

Undo/Redo機能の実装可否の前に、
どういったレベルまで実現するかも重要ではないでしょうか?
例えば同じ見積りを出すにしても、
単純に見積り合計金額を算出するだけなのと、
在庫や発注状況まで考慮してある程度の納期回答(的)なことを行うのでは、
実装する機能の複雑度は段違いかと思います。

「設計がしっかり」していれば、Mementoで対応可能かと思いますが。。。
maru
ぬし
会議室デビュー日: 2003/01/27
投稿数: 412
投稿日時: 2004-09-24 11:48
こんにちは。
返答ありがとうございます。

>どういったレベルまで実現するかも重要ではないでしょうか?
単に、テキストボックスやグリッド内の入力や貼り付け、削除を行ったテキスト文字を
元に戻すというだけのUndoです。
業務ロジックやDB内のフラグ制御をUndoするという意味ではありませんでした。

>「設計がしっかり」していれば、Mementoで対応可能かと思いますが。
もっとMementoパターンを理解してみます。
ちなみにあるサイトではCommandパターンでやるみたいなことも書いてました。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-09-24 12:08
unibon です。こんにちわ。

引用:

maruさんの書き込み (2004-09-24 10:46) より:
ソフトとしては、MDIウィンドウで、受注や見積など多種のウィンドウが同時に開けて
見積などの画面には、テキストボックスなどが並んでいるヘッダ部、グリッドで構成
されている明細部などがあります。


このアプリケーションでの Undo/Redo の単位は何でしょうか。ウィンドウの単位?テキストボックスの単位?

引用:

maruさんの書き込み (2004-09-24 10:46) より:
こういったソフトでUndo/Redo機能を実装しようとすると大変だと思うのですが、Undo/
Redo実装の基本概念など御存知の方おられませんでしょうか?
デザインパターンでMementoパターンがあるようですが、今回のような複雑なパターン
ではできるのかどうかがわかりません。


基本的には Memento と Command パターンあたりの概念でできます。また、Java の Swing のテキストエディターに Undo/Redo の実装例として javax.swing.undo パッケージがあります。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/javax/swing/undo/package-summary.html
このコードを見たり、解説書籍を見ることで、Undo/Redo の管理対象となる状態の差分を管理する複雑な Undo/Redo の概念は理解できるはずです。もっとも、このパッケージはテキストエディターに特化した部分もあり、多少邪魔な点もありますが、しかし、Undo/Redo の概念はこれで分かるはずです。逆に言うと、ちょっと言葉は悪くて申し訳ないのですが、これらを見ても分からないようだと、Undo/Redo の実装は難しいです。
ちなみに、単に状態を丸ごと保存したりそれを復元することや、ひとつ(やせいぜい有限の数個)前に戻す・進める、だけならば状態のスナップしょっとをスタックで管理するだけで良いので楽です。上述のような状態の差分の管理とは雲泥の差があります。

#以下後で追加。
すいません。掲示板を間違えていました(Java だと勘違いしてました)。
.NET にも javax.swing.undo パッケージのようなものがあるのかは分からないです。

[ メッセージ編集済み 編集者: unibon 編集日時 2004-09-24 12:45 ]
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-24 12:17
引用:

maruさんの書き込み (2004-09-24 10:46) より:
こういったソフトでUndo/Redo機能を実装しようとすると大変だと思うのですが、Undo/
Redo実装の基本概念など御存知の方おられませんでしょうか?
デザインパターンでMementoパターンがあるようですが、今回のような複雑なパターン
ではできるのかどうかがわかりません。



Undo/Redoの話でしたら、GoFデザインパターンの中で主に関連するのは、MementoパターンとCommandパターンになるのかなーと思います。

Mementoパターンはご存知のように、ある時点の状態を退避しておくものですから、概念的にはUndoはこれを適用するのが無難だと思います。ただ、退避対象とする状態(静的な構造)が複雑であればリソースの消費ですとかが問題になることもあります。

Commandパターンはシグナルのインスタンス化ですから、Redoにはこれを適用するのがいいのではないかと思います。ただ、再演算を行うことになりますので、操作(動的な構造)が複雑であればリソースの問題が出ることもあります。また、Undoされないオブジェクト(例えば実行時刻)に関わる演算結果は、以前の実行結果と異なる場合があります。
真逆の演算を作成出来る操作のみから構成するのであれば、このパターンの活用でUndoも実装出来ます。

ところで、Undo/Redoの根っこの部分の話になるのですが、UndoとRedoを繰り返した場合、Undo/Redo直後の結果は常に一意になるという認識でしょうか?これによっても適用するパターンは変わってきます。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-24 12:23
追加です。

引用:

ところで、Undo/Redoの根っこの部分の話になるのですが、UndoとRedoを繰り返した場合、Undo/Redo直後の結果は常に一意になるという認識でしょうか?これによっても適用するパターンは変わってきます。



認識ズレが怖いのは、特に「Redo」の方です。「Redo」が本当に「Redo」であるのか、「UndoのUndo」であるのかで適用パターンが制限を受けます。
#前者ならCommand、後者ならMementoって感じだと思います。
1

スキルアップ/キャリアアップ(JOB@IT)