不変オブジェクトで元に戻す/やり直し
-
06-07-2019 - |
質問
不変オブジェクトは特に 特定の共通の実装に便利 元に戻す/やり直しや中止などのイディオム トランザクション。たとえば、元に戻す。 A 元に戻すを実装するための一般的な手法 オブジェクトのスタックを保持することです どういうわけか各コマンドの実行方法を知っている 逆に(いわゆる" Command パターン」)。しかし、どのように考え出す 逆にコマンドを実行するには トリッキー。より簡単な手法は 不変オブジェクトのスタックを維持する システムの状態を表す 連続するコマンド間。次に、 コマンドを元に戻すには、単に元に戻す 以前のシステム状態に おそらく現在の状態を保存する REDOスタック)。
ただし、この記事では、不変オブジェクトを使用して「元に戻す」を実装する方法の実用的な例を示していません。オペレーション。たとえば、Gmailの受信トレイから10件のメールを削除します。それを行うと、元に戻すオプションがあります。この点で不変オブジェクトはどのように役立ちますか?
解決
不変オブジェクトはシステムの状態全体を保持するため、この場合、元の受信トレイを含むオブジェクトAがあり、その後、10個の電子メールが削除された受信ボックスを含むオブジェクトBがあります。 )BからAへのポインター。「取り消し」を1回行うと、システムの状態としてBの使用を停止し、代わりにAの使用を開始することを示します。
ただし、Gmailの受信トレイはこの手法を使用するには大きすぎます。実際にかなりの量のメモリに保存できるドキュメントで使用するので、複数レベルの取り消しのためにそれらの多くを保持できます。
10レベルのアンドゥを保持する場合、2つの不変オブジェクトを保持するだけでメモリを節約できる可能性があります。1つは現在のもので、もう1つは10個の「アンドゥ」からです。 ago-およびそれらの間に適用されたコマンドのリスト。
「元に戻す」を行うには、最後のCommandオブジェクトを除くすべてを再実行し、それを新しい現在のオブジェクトとして使用し、最後のCommandを消去します(または「Redo」オブジェクトとして保存します)。新しいアクションを実行するたびに、現在のオブジェクトを更新し、関連付けられたコマンドをリストに追加し、(リストが10コマンドを超える場合)元に戻すリストの先頭からオブジェクトに対して最初のコマンドを実行しますリストの最初のコマンドを破棄します。
他のさまざまなチェックポイントシステムを実行することもできます。システムのさまざまな数の完全な表現や、システム間のさまざまな数のコマンドが含まれます。しかし、それはあなたが引用した元のアイデアからますます大きくなり、典型的な可変システムのようになります。ただし、コマンドを一貫して元に戻す問題を回避します。コマンドをオブジェクトに適用するだけで、逆方向に適用する必要はありません。
SVNおよびその他のバージョン管理システムは、事実上、ディスクベースまたはネットワークベースの形式の取り消しとやり直しです。