J'ai un problème concernant un motif de commande avec fonction annuler/rétablir. Le problème simple est, quand mon histoire est pleine, je veux enlever la commande la moins récemment utilisée de l'histoire et ajouter le nouveau sur exécuter.Décalage de l'historique dans le modèle de commande avec annulation/rétablissement?
J'obtenu cet extrait de code de mon professeur:
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();
}
En doute vraiment le si la clause est incorrecte, car l'index de commande en cours reste 2 et commande uniquement à l'index 0 est déplacé vers 1. Mais il dit que c'est la voie à suivre. Qu'est-ce que je rate?
Merci pour la réponse rapide. Cela semble plus raisonnable en effet, mais ne dois-je pas réinitialiser le compteur de courant? Si nous disons que nous avons parcouru la boucle avec current = 2, les boucles suivantes ne provoqueraient-elles pas toujours l'historique [0] = history [1] et l'historique [1] = history [2] comme avant, donc l'historique des index [0] n'est jamais utilisé? – Blixxen
@Blixxen: Non. Lors de l'enregistrement de la première commande, 'current' est' -1', le test est faux, et vous faites 'current ++' pour le rendre' 0' et y stocker la commande. Lors de la sauvegarde du suivant, 'current' est' 0', le test est faux, vous faites 'current ++' pour le faire '1' et vous y stockez la commande. Lors de la sauvegarde du suivant, 'current' est' 1' et donc le test est ** true ** et vous faites 'history [0] = history [1]' dans la boucle (qui ne s'exécute qu'une seule fois), puis stockez le nouveau commande à 'current', qui est toujours' 1'. –
Ma mauvaise. Merci Monsieur! – Blixxen