2010-10-19 18 views
9

Ciao Sto per aggiungere nuove funzionalità all'applicazione che sto attualmente scrivendo. Devo scrivere una funzione di annullamento/ripristino. Tuttavia il 90% della nostra applicazione è pronta e non so quale sia il modo migliore per implementare questa funzionalità senza codice affetto (troppo) che è già stato creato.come implementare l'operazione di annullamento/ripristino senza modifiche importanti nel programma

+0

Dovremmo essere in grado di vedere alcuni codice o si dovrebbe descrivere ciò che il vostro programma era in ordine per noi per aiutare. –

+2

Considerando che non ci hai nemmeno detto che tipo di applicazione è (web, silverlight, desktop, ecc.) O che genere di genere è (gioco, CRUD, social networking, ecc.) Non c'è davvero nulla da fare per noi . – tster

+0

Questa è un'applicazione WPF che consente all'utente di disegnare diagrammi. L'utente può aggiungere diversi tipi di blocco, connetterli spostare e ridimensionare. Può anche aggiungere alcune proprietà al blocco: nome, date, ecc. – pieere

risposta

0

Un paio di domande: che cosa fa l'annullamento? Annulla tutte le modifiche o solo l'ultima?

In ogni caso, è necessario innanzitutto memorizzare lo stato dei campi di input (stato iniziale o ultima posizione desiderata), quindi il pulsante di annullamento assume tale stato e lo applica al campo.

Redo sarebbe lo stesso concetto, ma memorizzerebbe lo stato precedente all'annullamento.

+1

Undo opeartion dovrebbe essere in grado di annullare tutte le operazioni passo dopo passo. – pieere

8

Non ci sono molti dettagli qui. Tuttavia, la funzionalità Annulla/Ripristina viene in genere gestita tramite alcune varianti di Command Pattern. A seconda dell'architettura, questa potrebbe essere una semplice rielaborazione delle funzionalità di base in "comandi" o una revisione generale.

+1

Ecco come lo fai. Una volta che tutto ciò che fa il tuo programma viene canalizzato attraverso istanze di "comandi", allora sei lì all'80%. – Detmar

+3

Se gli architetti/sviluppatori originali non avevano questo nella loro mente quando hanno iniziato a progettare il sistema, mi sto appoggiando a questa revisione importante! – tster

+0

@tster: Tipicamente è una rielaborazione piuttosto importante, anche se dipende da quanto bene l'architettura deve iniziare. –

0

Avrete bisogno di uno stack di undo/redo, e grandi cambiamenti per rendere il tutto consapevoli di questo stack .. Mi dispiace, ma la magia non esiste:/

0

C'è un free library scritto da Rockford Lhotka per Business Objects che include funzionalità di annullamento/ripristino incorporate. Penso che lo implementa anche attraverso un'interfaccia, quindi dovrebbe essere "minimamente invasivo".

7

Come Reed Copsey dice che il modello più comune per l'attuazione fare/redo è Command Pattern. L'idea di base è quella di implementare azioni come i comandi che implemets certa interfaccia come questa:

public interface ICommand { public void Execute(); public void Undo(); } 

allora avete una classe (Control) che esegue tutti i comandi nel suo complesso, tale classe deve essere composto da un gruppo di comandi , quando esegui i comandi, ogni comando viene inserito all'interno di uno Stack (tramite il metodo push()), nel caso in cui desideri annullare le azioni, quindi prendi ogni elemento dallo Stack (tramite pop()) esegue il suo metodo Undo() .

public class Control { 
    private ArrayList<ICommand> commands = new ArrayList<ICommand>(); 
    private Stack<ICommand> stack = new Stack<ICommand>(); 

    public Control() {  
     commands.add(new Command1()); 
     commands.add(new Command2());  
     commands.add(new Command3());  
    } 

    public void Execute() { 
     for(int index=0; index<=command.size(); index++) { command.Execute(); stack.push(command);} 
    } 
    public void Undo() 
    { 
     while (!stack.empty()) { 
      ICommand command = (ICommand)stack.pop(); 
      if (command != null) { command.Undo(); }   
     }  
    } 
} 

Nota: questo è un codice molto semplice, solo per cercare di chiarire le idee alla base del modello di comando.

link text