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
come implementare l'operazione di annullamento/ripristino senza modifiche importanti nel programma
risposta
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.
Undo opeartion dovrebbe essere in grado di annullare tutte le operazioni passo dopo passo. – pieere
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.
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
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
@tster: Tipicamente è una rielaborazione piuttosto importante, anche se dipende da quanto bene l'architettura deve iniziare. –
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:/
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".
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.
Dovremmo essere in grado di vedere alcuni codice o si dovrebbe descrivere ciò che il vostro programma era in ordine per noi per aiutare. –
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
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