2012-01-05 15 views
2

私は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システムを実装することはできません。そのアクションは、元に戻すにはあまりにも影響を受けています。私は以下を実装したい:

  1. "境界を元に戻す"を提供するために注釈を使用する。 @Undoable()はメソッドがスタックに置かれたUndoActionを生成するものとしてマークします。 REQUIRE、NEST、JOIN ...トランザクションのようにパラメータ化できます。完全なオブジェクトグラフは、Undoableメソッドに入るとクローンされます。
  2. トランザクション(=メソッド)が終了すると、アルゴリズムは新しい状態と古い状態を比較し、差分を保存する必要があります。
  3. これを実装するには、AOPを使用できます。これにより、コアコードをきれいに保つことができます。

アンは今、私の質問: はすでにJavaで存在する上記の3つの機能のいずれかを実行しますか?私は、国家ベースの元に戻すこととそれに関連した問題に取り組むのは初めてではないと想像することができます(境界の取り消し、状態の比較...)

+0

AspectJは非常に強力です。これは、あなたがやりたいことに役立ちます。 – jbranchaud

+0

'addFirst()'が一定の制限を超えている場合、DequeとremoveLast()を使用できませんか? – trashgod

+1

UndoStackの正確な実装は難しくありません。 Swing UndoManagerはこれをうまくやってくれます。難しいことは、oldStateとnewStateを作成することです。複製するオブジェクト、新しいUndoActionに追加する場合、古いデータがどこかで参照されていないことを確認する方法です。 – parasietje

答えて

2

この質問がかなりの間オープンされた後、問題は:「いいえ、そのようなフレームワークは既に存在しません」

他の人のためのガイドとして、Eclipse Modeling FrameworkEMF.Editというフレームワークを検討しています。このフレームワークでは、モデルを記述言語で定義し、フレームワークがモデルと操作を処理します。これにより、自動的にアクションと元に戻す/やり直しが作成されます。

+0

@trashgod 3D Dequeについてのあなたの考えはとてもシンプルで、今私に気づかせてください。 – mKorbel

+0

@mKorbel:申し訳ありません、私のコメントは少し曖昧でしたOPノートとしての実装。私は[ここ](http://docs.oracle.com/javase/tutorial/uiswing/components/generaltext.html)を精緻化しました。 – trashgod

+0

@parasietjeもし私が正しく覚えていれば、アセンブラ/コボルが低レベルのプロセッサコードで作られています。 – mKorbel

1

参考までに、モデルとして役立つかもしれない他のフレームワーク(解決策でない場合)は、UndoManagerです。これは限られた数の編集をサポートしています。これは、コアの1つであるjavax.swing.undoパッケージの一部です。

関連する問題