2016-07-15 5 views
2

У меня возникла проблема с командным шаблоном с функцией отмены/повтора. Простая проблема в том, что когда моя история заполнена, я хочу удалить последнюю историю из истории и добавить новую в execute.Изменение истории в командном шаблоне с отменой/повторением?

Я получил этот фрагмент кода из моего профессора:

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(); 
} 

В самом деле сомневаюсь, что если-п является неправильным, так как текущий индекс команды остается 2 и только команда с индексом 0 сдвигается на 1. Но он говорит, что это путь. Что мне не хватает?

ответ

0

петля сама по себе хорошо, но две проблемы:

  1. Вы совершенно правы, что когда current == MAX_COMMANDS верно, и вы делаете петлю, current неправильно и нуждается в настройке.

  2. С точки зрения технического обслуживания 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(); 
} 
+0

Благодарим за быстрый ответ. Это звучит разумнее, но разве мне не нужно сбросить счетчик текущих событий? Если мы скажем, что мы прошли цикл с током = 2, не будут ли следующие циклы всегда вызывать историю [0] = историю [1] и историю [1] = историю [2], как раньше, поэтому история индекса [0] никогда не используется? – Blixxen

+0

@Blixxen: Нет. При сохранении первой команды 'current' равен' -1', тест является ложным, и вы выполняете 'current ++', чтобы сделать его' 0' и сохраните там команду. При сохранении следующего, 'current' является' 0', тест является ложным, вы выполняете 'current ++', чтобы сделать его' 1', и вы храните там команду. При сохранении следующего, 'current' равен' 1', поэтому тест ** true **, и вы выполняете 'history [0] = history [1]' в цикле (который выполняется только один раз), а затем сохраняйте новый команда на 'current', которая по-прежнему' 1'. –

+1

Мой плохой. Спасибо, сэр! – Blixxen