# Desfazer

Em computação, desfazer (do inglês undo) é uma comando e função do programa para reverter a última alteração que foi feita a algum objeto. Tais objetos podem ser, por exemplo, um texto, uma formatação de texto, uma imagem, uma multimídia digital, um sistema de arquivos. As alterações podem ser feitas pelo usuário ou pelo programa.
Refazer (do inglês redo) é um comando contrária a desfazer, isto é, para reverter alteração que foi feita por comando desfazer.
Ambas as funções são mais utilizadas nos seguintes tipos de programas:
* suítes de escritório como editores de texto, processadores de texto, planilhas eletrônicas (folhas de cálculo), etc.
* editores gráficos, editoração eletrônica, softwares CAD, etc.
* ferramentas para desenvolvimento de software como ferramentas CASE, ambientes de desenvolvimento, etc.
* gerenciadores de arquivos onde desfazer (refazer) pode ser aplicado a operações como copiar, mover, excluir e renomear de arquivos e pastas se o gerenciador de arquivos suporta journaling e Lixeira.
* os programas com widgets que permitem entrada de dados como caixa de texto ou barra de endereço se esses widgets oferecem as funções de desfazer e refazer.
* jogos de computador quando o jogador pode desfazer seu movimento, por exemplo, xadrez ou jogos de cartas.

## História

"Questões Comportamentais na Utilização de Sistemas Interativos", um relatório de pesquisa (1976) por Lance A. Miller e John C. Thomas do IBM, notou que "Seria bastante útil para permitir aos usuários retomar, pelo menos, o comando imediatamente anterior (através da emissão 'desfazer', algum comando especial)."
Os programadores no centro de pesquisa Xerox PARC atribuídos a tecla de atalho Ctrl-Z para comando Desfazer, que tornou-se um característico crucial em editores e processadores de texto na época de computador pessoal.
Nos anos 80, os comandos de desfazer multiníveis foram apresentados que permitiram aos usuários reverter umas seqüências de ações, não apenas a mais recente ação.

## Interface do usuário

* Botões Desfazer e Refazer na barras de ferramentas no GNOME
* Desfazer
* Refazer
Para ambos os desfazer e refazer comandos existe um conjunto de elementos de interface gráfica como os botões na barra de ferramentas e um grupo dos itens na barra de menu ou menu de contexto. No entanto, ambas os comandos foram usados em alguns programas velhos com interface de texto, por exemplo, editores de texto.

### Teclas de atalho

As teclas de atalho para acesso as comandos de desfazer e refazer:
* No GNOME (Linux), o usuário pode usar as teclas de atalho da aplicação como Ctrl+Z para desfazer.
* No OpenOffice.org (multiplataforma), o usuário pressiona Ctrl+Z para desfazer e Сtrl+Y para refazer.
* Na maioria das Apple Macintosh aplicações, o usuário pressiona Command-Z para desfazer e Command-Shift-Z para refazer.
* Na maioria das Windows aplicações, o usuário pressiona Ctrl+Z ou Alt+Backspace para desfazer e Ctrl+Y or Ctrl+Shift+Z para refazer.

## Modelos de Desfazer e Refazer

Os modelos de funções desfazer e refazer podem ser classificados como
* multinível e único nível
* linear e não-linear
* monousuário e multiusuário

### Multinível e único nível

O número de ações anteriores que podem ser revertidas varia de acordo com o programa. Por exemplo, o tamanho da pilha de comandos é as dezenas no Photoshop e é três no MS Paint.
Refazer reverte o que foi feito pelo comando desfazer. A forma mais simples de refazer é "flip" em que o uso de desfazer depois anulação refaz uma ação desfeita. Nesse caso, o programa vai para a frente e para trás entre dois estados quando o botão desfazer for pressionado.

### Linear e não-linear

Linear desfazer requer que o usuário reverteu a última ação antes de desfazer as anteriores. Com não-linear desfazer, a ação a ser revertido pode ser livremente escolhida na lista histórica de ações.

### Monousuário e multiusuário

O modelo monousuário é usado mais comumente quando os programas não suportam as mudanças a partir de múltiplos usuários. Quando vários usuários podem editar o mesmo documento simultaneamente o modelo multiusuário de desfazer é necessário. No model multiusuário global, desfazer reverte a última ação feita no documento independentemente de quem realizou a edição. Nesse caso, o desfazer local só reverte as ações feitas pelo usuário local.

## Implementação

Alguns padrões de desenho de software podem ser usados para suportar funções Desfazer e Refazer:
* Command - suporta lista histórica de comandos executados e multinível Desfazer/Refazer
* Memento - permite armazenar o estado interno de um objeto em um determinado momento, para que seja possível retorná-lo a este estado.