我遇到了关于具有撤消/重做功能的命令模式的问题。简单的问题是,当我的历史记录已满时,我想从历史记录中删除最近最少使用的命令,并在执行时添加新命令。
我从教授那里得到了这段代码:
public class CommandHistory implements CommandInterface{
private static final int MAX_COMMANDS = 2;
private Command[] history = new Command[MAX_COMMANDS];
private int current = -1;
@Override
public void execute(Command command) {
current++;
if (current == MAX_COMMANDS){ // if full, then shift
for (int i = 0; i < MAX_COMMANDS - 1; i++){
history[i] = history[i+1];
}
}
history[current] = command;
history[current].execute();
}
非常怀疑 if-clause 是不正确的,因为当前命令索引保持为2并且只有索引0处的命令转移到1.但他说这是要走的路。我错过了什么?
答案 0 :(得分:0)
循环本身很好,但有两个问题:
你是完全正确的,当current == MAX_COMMANDS
为真并且你进行循环时,current
是不正确的,需要调整。
从维护角度来看,current == MAX_COMMANDS
是错误的比较,它应该是current == history.length
。 (否则,很容易将history
的初始化更改为使用MAX_COMMANDS
以外的其他内容,但忘记更改current == MAX_COMMANDS
之类的每项检查。)
我会在增加之前检查current
,只有在你没有向内移动内容时才增加它:
public void execute(Command command) {
if (current == history.length - 1){ // if full, then shift
for (int i = 0; i < history.length - 1; i++) {
history[i] = history[i+1];
}
} else {
current++;
}
history[current] = command;
history[current].execute();
}