2016-07-15 1 views
2

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?

Répondre

0

La boucle elle-même est très bien, mais deux problèmes:

  1. Vous êtes tout à fait raison quand current == MAX_COMMANDS est vrai et vous faire la boucle, current est incorrecte et doit être ajustée.

  2. Du point de vue de l'entretien, current == MAX_COMMANDS comparaison ne tient pas, il devrait être current == history.length. (Dans le cas contraire, il est facile de changer l'initialisation de history utiliser autre chose que MAX_COMMANDS mais oublier de changer tous les chèques comme current == MAX_COMMANDS.)

Je vérifierais currentavant incrémenter et incrémenter seulement si vous ne pas déplacer le contenu vers le bas:

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

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

+0

@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'. –

+1

Ma mauvaise. Merci Monsieur! – Blixxen