私は現在、小さなテキスト エディター (学校向けのプロジェクト) をプログラミングしていますが、取り消し可能なコマンドを管理する適切でクリーンな方法を見つけるのに苦労しています。
(改善だけではないため、コード レビューの質問ではありません。アプリケーションを希望どおりに動作させたい場合は、コードを変更する必要があります)
私のアプリケーションの動作は次のとおりです。実際には文字の配列リストであるバッファを保持する具体的なサブジェクトがあります。この配列リストが変更されるたびに (挿入、切り取り、貼り付けなど)、サブジェクトはオブザーバーを更新します (現時点では 1 つの GUI のみで構成されます) (MVC パターン)。
元に戻すとやり直しのために今まで行っていたのは、バッファの状態全体を保存することでした(記念品を介して)。これは正常に機能していますが、
- 明らかに改善できます。
- 実装する必要がある新機能が機能していない (ユーザー アクションを記録して、いつでも再生できるようにする)
バッファの代わりにコマンドを保存する方法がわかりません。また、それが良い方法であるかどうかもわかりません。
プログラムの一部を次に示します (insert コマンドの場合)。
「GUI」.java
...
class KeyboardListener extends KeyAdapter {
@Override
public void keyPressed(KeyEvent e) {
...
commandManager.executeCommandInsert(caretStart, caretStop, e.getKeyChar());
...
}
...
}
CommandManager.java
...
public void executeCommandInsert(int start, int end, char character) {
addMementoUndo();
commandInsert.setCarets(start, end);
commandInsert.setChar(character);
commandInsert.execute();
}
public void addMementoUndo()
{
TextConcrete text = TextConcrete.getInstance();
this.commandsUndo.add(0, text.createMemento());
if(recordMode){
this.recordings.add(text.createMemento());
}
}
...
CommandInsert.java
...
public void execute(){
TextConcrete text = TextConcrete.getInstance();
text.insert(this.start, this.end, this.character);
}
...
TextConcrete.java
...
public void insert(int start, int end, char character){
//inserting in ArrayList
}
public CommandUndoable createMemento(){
CommandUndoable mem = new CommandUndoable();
mem.setState(getState());
return mem;
}
public String getState(){
StringBuilder temp = new StringBuilder();
for(int idx = 0; idx < this.state.size(); idx++){
temp.append(this.state.get(idx));
}
return temp.toString();
}
...
CommandUndoable は、バッファの状態を保存し、CareTaker (CommandManager) 内のメモのリストに保存する単なるメモです。
どんな助けでも本当に感謝します。