6

私は記事で以下を読みました

不変オブジェクトは、元にたりやり直しや中止可能なトランザクションなど、特定の一般的なイディオムを実装する場合に特に便利です。たとえば、元に戻す。undoを実装するための一般的な手法は、各コマンドを逆に実行する方法を何らかの形で知っているオブジェクトのスタックを保持することです(いわゆる「コマンドパターン」)。ただし、コマンドを逆に実行する方法を理解するのは難しい場合があります。より簡単な手法は、連続するコマンド間のシステムの状態を表す不変オブジェクトのスタックを維持することです。次に、コマンドを元に戻すには、単に前のシステム状態に戻します(そして、おそらく現在の状態をREDOスタックに保存します)。

ただし、この記事では、不変オブジェクトを使用して「元に戻す」操作を実装する方法の実用的な例は示されていません。たとえば...Gmailの受信トレイから10通のメールを削除します。これを行うと、元に戻すオプションがあります。この点で、不変オブジェクトはどのように役立ちますか?

4

1 に答える 1

6

不変オブジェクトはシステムの状態全体を保持するため、この場合、元の受信トレイを含むオブジェクトAと、10通の電子メールが削除された受信トレイを含むオブジェクトB、および(事実上)ポインターがあります。 BからAに戻り、「元に戻す」を1回実行すると、システムの状態としてのBの使用を停止し、代わりにAの使用を開始することを示します。

ただし、Gmailの受信トレイは大きすぎて、この手法を使用できません。実際にはかなり少量のメモリに保存できるドキュメントで使用するので、マルチレベルの元に戻すためにそれらの多くを保持できます。

10レベルの取り消しを維持したい場合は、2つの不変オブジェクト(1つは現在のもの、もう1つは10「取り消し」前のもの)とそれらの間に適用されたコマンドのリストのみを保持することで、メモリを節約できる可能性があります。

「元に戻す」を行うには、最後のCommandオブジェクトを除くすべてを再実行し、それを新しい現在のオブジェクトとして使用して、最後のCommandを消去します(または「Redo」オブジェクトとして保存します)。新しいアクションを実行するたびに、現在のオブジェクトを更新し、関連するコマンドをリストに追加してから(リストの長さが10コマンドを超える場合)、元にできるリストの先頭からオブジェクトに対して最初のコマンドを実行します。リストの最初のコマンドを破棄します。

他のさまざまなチェックポイントシステムも実行できます。これには、システムの完全な表現の可変数と、それらの間のコマンドの可変数が含まれます。しかし、それはあなたが引用した元のアイデアからますます遠くなり、典型的な可変システムのようになります。ただし、コマンドを一貫してリバーシブルにする問題は回避されます。コマンドをオブジェクトに適用する必要があるのは順方向であり、逆方向ではありません。

SVNおよびその他のバージョン管理システムは、事実上、ディスクベースまたはネットワークベースの形式の元に戻すとやり直しです。

于 2009-11-28T16:45:20.457 に答える