私はJava3Dで書かれたCADのようなツールと組み合わせて、Swingで書かれた古いアプリケーションのメンテナンスを担当しています。 メモリの使用に問題がありますプロファイリング後、これはアプリケーションの取り消し機能に関連しています。Swing/Java3Dアプリケーションの状態ベースの元に戻す:AOPソリューション?
すべての機能を元に戻すには、このような基本的な考え方と、状態ベースである:これらのUndoActionsを作成するための
public class UndoAction {
private UndoTarget target;
private Object old_data;
private Object new_data;
}
コードは、基本的には、アプリケーション全体で散らばっています。新しいオブジェクト、既存のオブジェクトの変更やサブツリーの修正の修正の区別がないので、次の処理が行われます。
- は、新しいオブジェクト
A
を作成します。何が起こることは、単一のアクションは次のようです。
- オブジェクトのフィールド
foo
を変更します。新しいUndoActionがスタックに置かれます。これにはfoo_oldとfoo_newが含まれています。 - オブジェクトのフィールド
bar
を変更します。 bar_oldとbar_newを含む新しいUndoActionがスタックに置かれます。 B.setField(A)
を実行します。新しいUndoActionがスタックに置かれ、field_oldとfield_new(== A)が含まれます。
これ以上の細かさや制御はありません。これはメンテナンス性を一切助けません。
私はこのシステムをリファクタリングしてメンテナンス性とメモリフレンドリーにしたいと考えています。残念ながら、コマンドパターンを使用してUndoシステムを実装することはできません。そのアクションは、元に戻すにはあまりにも影響を受けています。私は以下を実装したい:
- "境界を元に戻す"を提供するために注釈を使用する。 @Undoable()はメソッドがスタックに置かれたUndoActionを生成するものとしてマークします。 REQUIRE、NEST、JOIN ...トランザクションのようにパラメータ化できます。完全なオブジェクトグラフは、Undoableメソッドに入るとクローンされます。
- トランザクション(=メソッド)が終了すると、アルゴリズムは新しい状態と古い状態を比較し、差分を保存する必要があります。
- これを実装するには、AOPを使用できます。これにより、コアコードをきれいに保つことができます。
アンは今、私の質問: はすでにJavaで存在する上記の3つの機能のいずれかを実行しますか?私は、国家ベースの元に戻すこととそれに関連した問題に取り組むのは初めてではないと想像することができます(境界の取り消し、状態の比較...)
AspectJは非常に強力です。これは、あなたがやりたいことに役立ちます。 – jbranchaud
'addFirst()'が一定の制限を超えている場合、DequeとremoveLast()を使用できませんか? – trashgod
UndoStackの正確な実装は難しくありません。 Swing UndoManagerはこれをうまくやってくれます。難しいことは、oldStateとnewStateを作成することです。複製するオブジェクト、新しいUndoActionに追加する場合、古いデータがどこかで参照されていないことを確認する方法です。 – parasietje