記念品パターンの背後にある哲学


9

私はインターネットのさまざまな情報源からの記念品のパターンについて読んでいます。さまざまなソースからの情報の違いにより、このパターンが実際に必要な理由について混乱が生じました。

dofactory実装は、このパターンの主な目的は、システムの状態を復元することであると述べています。

Wikiによると、第一の目的はシステムの変更を復元できるようにすることです。これは別の影響を与えます-システムが復元を必要とせずにmemento実装を持つことが可能であると言っています。そして、その復元機能は、この機能の1つです。

OODesignによると

ある時点でオブジェクトの内部状態をキャプチャし、後でオブジェクトをその状態に復元する機能が必要になる場合があります。このようなケースは、エラーまたは障害の場合に役立ちます。

だから、私の質問は、なぜこれを正確に使用するのですか?以前の状態を保存することですか、それとも世話人とメメントの間のカプセル化を促進することですか?このタイプのカプセル化がなぜそれほど重要なのですか?

編集:訪れる人のために、この実装をチェックしてください!

編集:私は問題の解決策の実装に取り​​組んでいます。それについて別の質問を投稿し、その質問をこの質問にリンクします。貴重なご提案をお寄せいただきありがとうございます。

編集3ここに私のサンプル実装へのリンクがあります

回答:


2

同様のパターン、メモ、またはメモ化も状態を格納しますが、プログラム速度の最適化としてよく使用されます。時間のかかる操作に共通の入力と出力の数が限られている場合、最も一般的な操作(またはそれらすべて)をハッシュテーブルに保存できます。同じ入力で再度呼び出されると、最初にハッシュテーブルがチェックされ、見つかった場合は、再計算せずに以前の出力が返されます。

Mementoパターンはパフォーマンスにも使用できると想像します。逆の状態変化に対してすべての逆計算を行うのではなく、以前の状態から復元するだけです。一部の機能は一方向であるため、以前の状態を保存しない限り、元に戻すことはできません。

Mementoパターンを使用して、正弦波のような周期的または対称的な関数をメモできます。0〜180度のすべての値を計算し、それらを逆にたどって180〜360度の負の値を取得します。さらに良いのは、0〜90の値を計算してから、それらの値を逆方向に移動して90〜180、180〜270の順方向、270〜360の逆方向に取得することです。

WordのCtrl-Z、または任意のソフトウェアの元に戻す機能は、メモリメントパターンを使用して実装されている可能性があり、場合によっては、各変更を行った機能の逆によって実装される可能性があります。2番目のケースでは、どの関数が呼び出されたかの履歴は記念品になるため、元に戻すには常に記念品パターンが使用されると思います。


逆計算を回避するため、および定期的な関数のために使用される記憶パターン-この情報をありがとう!概念を浸透させる実用的な例のようなものはありません!
TheSilverBullet 2012

また、ニュートン法のような方法で使用して、平方根近似を行って、いつ終了するかを決定することもできます。 mitpress.mit.edu/sicp/full-text/book/… 基になる浮動小数点表現の精度は制限されているため、すべての数値は最終的に繰り返し近似を持ちます。古い近似が何であるかがわかっている場合は、最初に回答を繰り返したときに近似を停止し、(ある程度の時間とメモリを犠牲にして)最大の精度を得ることができます。
GlenPeterson 2012

8

Mementoパターンは、それ自体で、状態をキャプチャして保存するためだけに使用されます。カプセル化は、システムの残りの部分から状態を保護するためにのみ存在します。状態が取得されたら、慎重に制御する必要があります。たとえば、保存後に以前の状態を変更できるようにすることは意味がありません(履歴が変更されます)。他のオブジェクトに影響を与えずに、あるオブジェクトの以前の状態に戻るだけでは意味がありません(防止するため)。システムが完全に無効な状態になるのを防ぎます)。

私が見たMementoの最も一般的な用途は、元に戻す機能をサポートすることです。また、時間を遡ってREDO機能を保存することにも関連しています。


また、コピーロジックとシリアル化ロジック(ワイヤーを介してオブジェクトを送信したり、状態をファイルに保存したりする)でも使用しました。
スコットウィットロック

@ScottWhitlock Mementoにとって、状態をファイルに保存することは理にかなっています。Mementoオブジェクトは、それ自体を指定されたフォーマットに書き込み、このフォーマットを読み取ることによって新しいフォーマットを作成する機能を持ちますが、Caretakerは、状態を外部フォーマットに保存したり、外部フォーマットから状態をロードしたりするインターフェースを提供します-これは単なる拡張機能です状態をメモリに保存します。しかし、コピーロジックで使用されていることは本当にわかりません。私はそれについてもっと考えなければならないでしょう。
Thomas Owens


@ThomasOwens、あなたの説明の重要な部分に感謝します。これは、記念品が基本的に状態を「保存」するためのものであるという説明です。復元するかどうかは、実装者の裁量です!私のすべての参照から説明のこの部分が欠けているのを見つけました!!
TheSilverBullet 2012

@ScottWhitlock、あなたのmemento実装へのリンクに感謝します!基本的な使い方だけでなく、直感的な使い方も理解できました!
TheSilverBullet 2012

1

これらすべての定義は、同じ方向にあなたを導きます。彼らはすべて、何かを以前の状態に復元できることがポイントであると言っています。その何かは、システム全体でも、単一のオブジェクトでもかまいません。

このパターンは、レコードの状態が時間とともに変化する場合に役立ちますが、いつでも以前の状態に復元できるようにするビジネス要件があります。または、以前の任意の時点のようにレコードを表示できるようにする必要がある場合。これらのタイプの要件は、多くのタイプのシステムで非常に一般的です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.