問題タブ [memento]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Mementoパターン(およびコマンド)を使用して複雑なオブジェクトの状態を保存する
私は、数か月前に開始したJavaの小さなUMLエディタープロジェクトに取り組んでいます。数週間後、UMLクラス図エディターの作業用コピーを入手しました。
しかし今、私はそれを完全に再設計して、シーケンス、状態、クラスなどの他のタイプの図をサポートしています。これは、グラフ構築フレームワークを実装することによって行われます(私は、この主題に関するCayHorstmannの作業に大きく影響を受けています。バイオレットUMLエディター)。
友人の1人が、プロジェクトにDo / Undo機能を追加するのを忘れたと言うまで、再設計は順調に進んでいました。これは、私の意見では非常に重要です。
オブジェクト指向のデザインコースを思い出して、すぐにMementoとCommandパターンについて考えました。
これが取引です。2つのArrayListを含む抽象クラスAbstractDiagramがあります。1つはノード(プロジェクトではElementsと呼ばれます)を格納するためのもので、もう1つはEdges(プロジェクトではLinksと呼ばれる)を格納するためのものです。この図は、おそらく、元に戻す/やり直すことができるコマンドのスタックを保持します。かなり標準的です。
これらのコマンドを効率的に実行するにはどうすればよいですか?たとえば、ノードを移動したいとします(ノードはINodeという名前のインターフェイスタイプになり、そこから派生した具象ノード(ClassNode、InterfaceNode、NoteNodeなど)があります)。
位置情報はノード内の属性として保持されるため、ノード自体でその属性を変更することにより、状態が変更されます。表示が更新されると、ノードが移動します。これはパターンのMemento部分です(私は思います)が、オブジェクトが状態そのものであるという違いがあります。
さらに、元のノードのクローンを(移動する前に)保持すると、古いバージョンに戻すことができます。同じ手法が、ノードに含まれる情報(クラス名またはインターフェース名、ノートノードのテキスト、属性名など)にも適用されます。
問題は、図で、元に/やり直し操作時にノードをそのクローンに置き換えるにはどうすればよいですか?ダイアグラムによって参照されている(ノードリストにある)元のオブジェクトのクローンを作成した場合、そのクローンはダイアグラム内で参照されておらず、ポイントしているのはコマンド自体だけです。シャウド私は、IDに従ってノードを見つけるためのメカニズムを図に含めているので(たとえば)、図でノードをそのクローンに置き換えることができますか(またはその逆)?それを行うのはMementoとCommandパターン次第ですか?リンクはどうですか?それらも移動可能である必要がありますが、リンク専用(およびノード専用)のコマンドを作成したくないので、コマンドのオブジェクトのタイプに応じて適切なリスト(ノードまたはリンク)を変更できる必要がありますを参照しています。
どのように進めますか?つまり、オブジェクトのタイプ(ノードまたはリンク)によっては、オブジェクトの状態をコマンド/ mementoパターンで表現して、オブジェクトを効率的に復元し、元のオブジェクトをダイアグラムリストに復元できるようにするのに問題があります。
どうもありがとう!
ギヨーム。
PS:はっきりしない場合は、教えてください。メッセージを明確にします(いつものように!)。
編集
これが私の実際の解決策であり、この質問を投稿する前に実装を開始しました。
まず、次のように定義されたAbstractCommandクラスがあります。
次に、各タイプのコマンドは、AbstractCommandの具体的な派生を使用して実装されます。
だから私はオブジェクトを移動するコマンドを持っています:
MoveRemoveCommandもあります(オブジェクト/ノードを移動または削除するため)。instanceofメソッドのIDを使用する場合、ダイアグラムを実際のノードまたはリンクに渡して、ダイアグラムからそれ自体を削除できるようにする必要はありません(これは悪い考えだと思います)。
AbstractDiagram図; 追加可能なオブジェクト; AddRemoveTypeタイプ;
最後に、ノードまたはリンクの情報(クラス名など)を変更するために使用されるModificationCommandがあります。これは、将来、MoveCommandとマージされる可能性があります。このクラスは今のところ空です。私はおそらく、変更されたオブジェクトがノードであるかエッジであるかを判断するメカニズムを使用してIDを実行します(IDのinstanceofまたは特別な表記を介して)。
これは良い解決策ですか?
.net - .NET での Memento の実装
.NET での memento の 2 つの異なる実装を見てきました。
1 つは非常に単純です。オブジェクトはそれ自体の別のインスタンスを作成します。
もう 1 つは、BinaryFormatter と MemoryStream を使用してオブジェクトをシリアル化することです。
好ましい方法はどれですか? 誰でも各アプローチの長所/短所を指摘できますか?
ところで、リソースの使用状況/開発者の生産性の観点から見てみたいと思います。最初にそれを述べなかったことをお詫びします。
記念品を永続化する必要がないと仮定すると、どちらが優先されますか?
開発者の生産性の観点からは、シリアライゼーションが圧倒的に有利です。プライベート コンストラクターやフィールド割り当てなどを含む可能性のあるクローンを手動で作成するよりも、任意のオブジェクトに対して一般的な数行を作成する方が効率的です。
しかし、繰り返しになりますが、シリアライゼーションは重いかもしれません - 私は確信が持てません。
design-patterns - オブジェクトのバージョン管理を行うためのいくつかのデザインパターンは何ですか?
オブジェクトの変更時にオブジェクトの履歴を保持するためのいくつかのデザインパターンは何ですか。イベントソーシングほど強力なものは必要ありません。特定のイベントが発生したとき(この場合はフォームの印刷ボタンが押されたとき)に過去のバージョンを保存する機能だけが必要です。
c# - TextBox の優れた効率的な元に戻す/やり直し機能を実装する方法
元に戻す/やり直し機能を実装したい TextBox があります。既に若干の元に戻す機能があるかもしれないと読みましたが、バグがありますか? とにかく、元に戻す機能とやり直し機能の両方を実装して、先に進む方法を学びたいと思います。
Memento パターンについて読み、CodeProjectのGeneric Undo/Redoの例をいくつか調べました。そして、パターン kiiind は理にかなっています。それを実装する方法について頭を悩ませているようには見えません。そして、 a のコンテンツに対して効率的にそれを行う方法TextBox
。
もちろん、 textbox.Text
whenだけを格納することもできますが、大量のテキストが含まれているTextChanges
場合は特に、大量のメモリを非常に高速に占有してしまいます。TextBox
とにかく、この機能を実装するための適切で明確で効率的な方法を実装する方法について、アドバイスを探しています。一般的にも、特に TextBox の場合も c",)
design-patterns - Mementoの正しい実装
mementoデザインパターンでは、世話人をオリジネーターの集合体として持つのは間違っていますか?
javascript - Javascript のメメント
CRUD フォームで使用する memento パターン (GoF) の JavaScript 実装を探しています。基本的なレベルでは、入力の変更を元に戻すだけで十分ですが、YUI や Ext などの標準の JS フレームワークで使用して、グリッド アクション (新しい行、行の削除など) を元に戻したりやり直したりすると便利です。
ありがとう
java - VBAでのMementoの実装
Memento パターン (GoF) の VBA 実装を探しています。Java バージョンを Wikipedia から変換することを検討しています。Excel アドインの元に戻す/やり直し機能に使用されます。
具体的には、次の行に問題があります。
または、より具体的にするために、誰かがVBAでこれを書き直すことができます:
変換しようとしているコード全体は、上記のウィキペディアのリンクから入手できます。
ありがとう
c# - 更新前と更新後の 2 つのオブジェクトの状態の比較
まず最初に。私は次のクラスを持っています:
}
WinformでCシャープを使用しています。私のアプリケーションのフロント エンドには、従業員の最初の名前を持つ左端側にリスト ボックスがあります。左側には、リスト ボックスで選択された従業員に対応するさまざまなテキスト ボックスがあります。従業員を選択するたびに、従業員 ID、名前、役職などの属性がこれらのフィールドに表示されるようにコーディングしました。
ユーザーが従業員の属性を変更した場合、更新ボタンをクリックしてデータベースを変更する必要があります。本当の問題は、ユーザーが選択した従業員のフィールドを変更し、更新ボタンをクリックせずに別の従業員を選択した場合、ポップアップ ボックスを表示して、ユーザーが別の従業員を選択した場合、すべての変更が失った。
このため、従業員の以前の状態を保持するために momento クラスを作成しました。== 演算子のオーバーロードも試みました
私の考えは、2 つのオブジェクトを比較することでしたが、成功しませんでした。どうすればいいですか??変更が行われた場合にポップアップを表示するにはどうすればよいですか??ポップアップを表示するコードをどこに配置すればよいですか?
design-patterns - Memento パターンで memento のデフォルトのインスタンスを作成する方法は?
Memento パターンを使用して、マルチインスタンス フォームのプロパティを保存します。このフォームでは、ユーザーが親フォーム内に n 個のフォームを作成します。記念品の目的は、ユーザーが親フォームを閉じてから再度開いたときに、同じ数のフォームとその設定を取り戻すことです。フォームの記念品の保存は、親フォームの「保存」ボタンで行います。ということで、2つチャレンジです..
- 新しいフォームを開くときに使用するプロパティの既定のセットが必要なので、これらの既定値をどこに設定すればよいでしょうか? 記念品の既定の空のコンストラクター、またはオリジネーターのどこか (どこ?) で?
- 次に、ユーザーがデフォルトを変更できるようにして、独自のデフォルトの記念品を作成できるようにします。これはどのように/どこに保存され、そのようなデフォルトの記念品が設定されているかどうかをどのように判断しますか?
もちろん、これを微調整して何らかの形で機能させることもできますが、これを解決する一般的なパターンの説明があるかどうかを知りたいので、従うべき確固たるガイドラインがあります。
乾杯!
java - DTO パターン vs Memento パターン
動機と実装の面で、 DTO パターン(Fowler による) とMemento パターン(GoF による)の違いは何ですか? 同じクラスでもいいですか?はいの場合、どのように名前を付けることができますか (xxxDTO または xxxMemento)? 実装に主な違いはありますか? MVPアーキテクチャのどこに位置するのでしょうか?
ありがとう。