Desfazer - Undo

Desfazer é uma técnica de interação implementada em muitos programas de computador. Ele apaga a última alteração feita no documento, revertendo-o para um estado anterior. Em alguns programas mais avançados, como processamento gráfico , desfazer anulará o último comando feito no arquivo que está sendo editado. Com a possibilidade de desfazer, os usuários podem explorar e trabalhar sem medo de cometer erros, pois eles podem ser desfeitos facilmente.

As expectativas de desfazer são fáceis de entender: ter uma funcionalidade previsível e incluir todos os comandos "desfazíveis". Normalmente, desfazer está disponível até que o usuário desfaça todas as operações executadas. Mas existem algumas ações que não são armazenadas na lista de desfazer e, portanto, não podem ser desfeitas. Por exemplo, salvar o arquivo não pode ser desfeito, mas é enfileirado na lista para mostrar que foi executado. Outra ação que geralmente não é armazenada e, portanto, não pode ser desfeita, é rolar ou selecionar .

O oposto de desfazer é refazer . O comando refazer reverte o desfazer ou avança o buffer para um estado mais recente.

Os componentes comuns da funcionalidade de desfazer são os comandos que foram executados pelo usuário, o (s) buffer (es) de histórico que armazenam as ações concluídas, o gerenciador de desfazer / refazer para controlar o buffer de histórico e a interface do usuário para interagir com o usuário.

Na maioria dos aplicativos do Microsoft Windows , o atalho de teclado para o comando desfazer é Ctrl + Z ou Alt + Backspace, e o atalho para refazer é Ctrl + Y ou Ctrl + Shift + Z.

Na maioria dos aplicativos Apple Macintosh , o atalho para o comando desfazer é Command -Z e o atalho para refazer é Command - Shift -Z.

Em todas as plataformas, as funções desfazer / refazer também podem ser acessadas por meio do menu Editar .

História

A capacidade de desfazer uma operação em um computador foi inventada de forma independente várias vezes, em resposta ao modo como as pessoas usavam os computadores.

O Sistema de Recuperação e Edição de Arquivos , desenvolvido a partir de 1968 na Brown University , é relatado como o primeiro sistema baseado em computador a ter um recurso de "desfazer".

Warren Teitelman desenvolveu um Assistente de Programador como parte da BBN-LISP com uma função Desfazer, em 1971.

O editor de texto Xerox PARC Bravo tinha um comando Undo em 1974. Um relatório de pesquisa de 1976 por Lance A. Miller e John C. Thomas da IBM , Behavioral Issues in the Use of Interactive Systems , observou que "seria muito útil permitir que os usuários para 'retomar' pelo menos o comando imediatamente anterior (emitindo algum comando especial 'desfazer'). " Os programadores do centro de pesquisa Xerox PARC atribuíram o atalho de teclado Ctrl-Z ao comando desfazer, que se tornou um recurso crucial dos editores de texto e processadores de texto na era do computador pessoal . Em 1980, Larry Tesler da Xerox PARC começou a trabalhar na Apple Computer . Lá, ele e Bill Atkinson defenderam a presença de um comando desfazer como um acessório padrão no Apple Lisa . Atkinson conseguiu convencer os desenvolvedores individuais do software aplicativo do Lisa a incluir um único nível de desfazer e refazer, mas não teve sucesso em fazer lobby por vários níveis. Quando a Apple apresentou o sucessor do Lisa, o Macintosh , estipulou que todos os aplicativos padrão deveriam incluir um “Desfazer” como o primeiro comando no menu “Editar”, que permaneceu o padrão no macOS e no Windows até hoje.

Os comandos de desfazer em vários níveis foram introduzidos na década de 1980, permitindo aos usuários retomar uma série de ações, não apenas a mais recente. EMACS e outros editores de tela com compartilhamento de tempo o tinham antes do software de computador pessoal. CygnusEd foi o primeiro editor de texto do Amiga com um recurso de desfazer / refazer ilimitado. AtariWriter , um aplicativo de processamento de texto lançado em 1982, apresentava desfazer. NewWord, outro programa de processamento de texto lançado pela NewStar em 1984, tinha um comando de apagar. O VisiWord da IBM também tinha um comando de undelete.

Desfazer e refazer modelos

Os modelos de desfazer podem ser categorizados como lineares ou não lineares. O modelo de desfazer não linear pode ser subclassificado em modelo de script, modelo us & r, modelo triádico e desfazer seletivo.

Algumas propriedades comuns dos modelos são:

  • propriedade de execução estável: um estado é representado como uma lista ordenada de comandos. Isso significa que um comando "é sempre desfeito no estado em que foi alcançado após a execução original".
  • Execução estável enfraquecida: Isso significa que se desfazer for executado, todos os comandos que dependem do comando desfeito serão desfeitos dependendo do comando.
  • propriedade de resultado estável: esta propriedade tem o significado semelhante à propriedade de execução estável, exceto para a lista. A lista ordenada de comandos inclui que eles foram executados em vez de apenas os comandos.
  • comutativo: Isso significa que o estado alcançado após desfazer e refazer dois comandos diferentes é o mesmo quando eles são executados na ordem inversa.
  • propriedade desfazer minimalista: descreve que "a operação de desfazer do comando C desfaz apenas o comando C e todos os comandos anteriores a C que dependem de C."

Desfazer linear

O desfazer linear é implementado com uma pilha (estrutura de dados LIFO) que armazena um histórico de todos os comandos executados. Quando um novo comando é executado, ele é adicionado ao topo da pilha. Portanto, apenas o último comando executado pode ser desfeito e removido do histórico. Desfazer pode ser repetido, desde que o histórico não esteja vazio.

Modelo linear restrito

O modelo linear restrito é um aumento do modelo linear de desfazer. Ele satisfaz a propriedade de execução estável descrita acima para desfazer linear, porque este modelo não mantém a propriedade se um comando for executado enquanto a lista de histórico incluir outros comandos. O modelo linear restrito limpa a lista de histórico antes que um novo comando seja adicionado. Mas outras restrições também estão disponíveis. Por exemplo, o tamanho da lista de histórico pode ser restrito ou quando um tamanho definido é atingido, o primeiro comando executado é excluído da lista.

Desfazer não linear

A principal diferença entre desfazer linear e desfazer não linear é a possibilidade de o usuário desfazer os comandos executados em uma ordem arbitrária. Eles têm a chance não de desfazer o comando mais recente, mas de escolher um comando da lista. Para o modelo não linear, existem subclasses que implementam este modelo.

Modelo de script

O modelo de script trata as ações do usuário como a edição de um script de comandos. A lista de histórico dos comandos executados é interpretada "como um script, o efeito de desfazer é definido como o mesmo como se a ação desfeita nunca tivesse ocorrido em primeiro lugar." Como resultado de desfazer, o estado deve ser o mesmo que se o comando desfeito nunca tivesse sido executado. Uma desvantagem desse modelo é que o usuário deve saber a conexão entre o comando desfeito e o estado atual para evitar efeitos colaterais. Um deles pode ser, por exemplo, a duplicação. Outros problemas são que se "os comandos subsequentes forem refeitos em um estado diferente do que foram originalmente executados em interfaces de manipulação direta, essa reinterpretação da ação original do usuário nem sempre é óbvia ou bem definida".

Modelo US&R

A característica especial deste modelo é que ele tem a opção de pular um comando. Isso significa que refazer um comando pode ser ignorado. O comando que é ignorado é marcado como ignorado, mas não excluído. Quando novos comandos são executados, a lista de histórico é retida, de forma que a ordem dos comandos executados possa ser reproduzida com ela. A ordem pode ser descrita através de uma árvore de histórico que é um gráfico direcionado, “pois é possível continuar refazendo comandos de outra ramificação criando um link no gráfico”. Mesmo que o conjunto de comandos seja simples e fácil de entender, a estrutura complexa com pular e vincular ramificações é difícil de compreender e lembrar, quando o usuário deseja desfazer mais de uma etapa.

Modelo triádico

Este modelo de desfazer não linear tem além de desfazer e refazer a possibilidade de girar. Possui a mesma estrutura de dados dos modelos mencionados acima, com uma lista de histórico e uma lista de refazer separada que inclui as operações de refazer. A operação de rotação define o último comando da lista de refazer na frente dele. Por um lado, isso significa que o próximo comando a ser refeito pode ser selecionado colocando-o na frente. Por outro lado, a rotação pode ser usada "para selecionar o local na lista de refazer onde a próxima operação de desfazer colocará o comando". A lista de refazer, portanto, não é ordenada. “Para desfazer um comando isolado, o usuário deve desfazer uma série de etapas, girar a lista de refazer e, em seguida, refazer uma série de etapas”. Para refazer a lista deve ser girada até que o comando desejado esteja acima.

Desfazer seletivo

Jakubec et al. dizem que desfazer seletivo é um recurso que um modelo pode oferecer, mas para desfazer seletivo não há uma definição clara. Os autores selecionaram funções que um modelo deve ter quando suporta desfazer seletivo. Deve ser possível "desfazer qualquer ação executada no buffer de histórico. Ações independentes da ação que está sendo desfeita devem ser deixadas intocadas". Da mesma forma que o refazer deve ser possível a qualquer comando desfeito. A terceira função para desfazer seletivo é que "nenhum comando pode ser descartado automaticamente do buffer de histórico sem solicitação direta do usuário." Para desfazer seletivo aplica-se que desfazer e refazer são executáveis ​​fora de qualquer contexto. Existem três questões principais. A primeira é que os comandos desfeitos podem estar fora do contexto original. Por meio disso, podem haver referências mortas que precisam ser tratadas. O segundo problema é que comandos modificados podem ser desfeitos e, portanto, tem que ser resolvido qual estado após desfazer será apresentado. O terceiro problema é descartar problemas de comando. Desfazer seletivo não tem ponteiro nas listas, então isso significa que nenhum comando deve ser descartado da pilha.

Desfazer seleção direta

Desfazer direto seletivo é uma extensão do desfazer linear restrito com uma árvore de histórico. A operação cria uma cópia do comando selecionado, executa-o e adiciona-o à lista de histórico. Há duas operações não lineares desfazer seletivo e refazer seletivo são definidas, por isso é mais simétrico.

Aplicativo multiusuário

Quando vários usuários podem editar o mesmo documento simultaneamente, é necessário desfazer para vários usuários. Desfazer multiusuário global reverte a última ação feita no documento, independentemente de quem executou a edição. O desfazer multiusuário local reverte apenas as ações feitas pelo usuário local, o que requer uma implementação de desfazer não linear.

Onde desfazer pode ser usado para retroceder em várias edições, o comando refazer avança no histórico de ações. Fazer uma nova edição geralmente limpa a lista de refazer. Se um modelo de refazer ramificado for usado, a nova edição ramificará o histórico de ações.

O número de ações anteriores que podem ser desfeitas varia de acordo com o programa, versão e recursos de hardware ou software. Por exemplo, o tamanho da pilha de desfazer / refazer padrão no Adobe Photoshop é 20, mas pode ser alterado pelo usuário. Como outro exemplo, as versões anteriores do Microsoft Paint permitiam apenas que até três edições fossem desfeitas; a versão introduzida no Windows 7 aumentou esse limite para 50.

Os recursos de desfazer simplistas, de edição única, às vezes eliminam o "refazer", tratando o próprio comando desfazer como uma ação que pode ser desfeita. Isso é conhecido como modelo flip undo, porque o usuário pode alternar entre dois estados do programa usando o comando undo. Esse era o modelo padrão antes da adoção generalizada de desfazer em vários níveis no início da década de 1990.

Desfazer implementação

Desfazer pode ser implementado por meio de diferentes padrões. Os padrões mais comuns são o padrão de comando e o padrão de memento .

Padrão de comando

O padrão de comando é um padrão de design de software que encapsula informações da operação em objetos de comando. Isso significa que cada ação é armazenada em um objeto. A classe de comando abstrata implementa uma operação de execução abstrata, portanto, cada objeto de comando tem uma operação de execução. Para desfazer, também deve haver uma operação não executada, que desfaz o efeito do comando executado, que são armazenados em uma lista de histórico. Desfazer e refazer são implementados de forma que a lista seja executada para frente e para trás quando o comando execute ou uncecute é chamado.

Para desfazer único, apenas o comando executado é armazenado. Em contraste com o desfazer em vários níveis, onde não apenas a lista de histórico com os comandos é salva, mas também o número de níveis de desfazer pode ser determinado com base no comprimento máximo da lista.

Padrão de memento

Com o padrão memento, o estado interno de um objeto é armazenado. O objeto no qual o estado é salvo é chamado memento e é organizado por meio do originador memento. Isso retorna um memento, inicializado com informações do estado atual, quando desfazer é executado, para que o estado possa ser verificado. O memento é visível apenas para o originador.

No padrão memento, o mecanismo de desfazer é chamado de zelador. É responsável pela guarda das lembranças, mas nunca altera o conteúdo delas. Para desfazer, o zelador solicita um memento do originador e, em seguida, aplica o desfazer.

A maior parte do mecanismo de desfazer pode ser implementado sem dependência de aplicativos específicos ou classes de comando. Isso inclui "o gerenciamento da lista de histórico, o rolador de histórico, entradas de menu para desfazer e refazer e atualização das entradas de menu dependendo do nome do próximo comando disponível."

Cada classe de comando tem um método do que é chamado quando um comando é executado. O método desfazer implementa a operação reversa do método fazer. Para implementar o inverso, existem várias estratégias diferentes.

  • ponto de verificação completo : Isso significa que o estado completo é salvo após a execução de um comando. Esta é a implementação mais fácil, mas não é altamente eficiente e, portanto, não é usada com frequência.
  • reexecução completa: Portanto, o estado inicial é salvo e cada estado na lista de histórico pode ser alcançado através de "começando com o estado inicial e refazendo todos os comandos desde o início do histórico."
  • checkpoint parcial : esta é a estratégia mais usada. O estado do aplicativo alterado é salvo e com desfazer, a parte do estado é definida de volta para o valor de encaminhamento.
  • função inversa: a função inversa não precisa de informações de estado salvas. "Por exemplo, o movimento pode ser revertido movendo o objeto para trás em uma quantidade relativa." Para desfazer seletivo, não há informações suficientes para salvar o estado.

Veja também

Referências

  1. ^ a b c d e f g h i j k l m n Berlage, Thomas (01/09/1994). "Um mecanismo de desfazer seletivo para interfaces gráficas de usuário com base em objetos de comando". ACM Transactions on Computer-Human Interaction . 1 (3): 269–294. doi : 10.1145 / 196699.196721 . ISSN  1073-0516 .
  2. ^ Myers, Brad A .; Kosbie, David S. (13/04/1996). Objetos de comando hierárquicos reutilizáveis . ACM. pp.  260–267 . doi : 10.1145 / 238386.238526 . ISBN 0897917774.
  3. ^ a b c d e f g h Jakubec, Karel; Polák, Marek; Nečaský, Martin; Holubová, Irena (2014). "Desfazer / Refazer operações em ambientes complexos" . Procedia Computer Science . 32 : 561–570. doi : 10.1016 / j.procs.2014.05.461 . ISSN  1877-0509 .
  4. ^ Moran, Chuktropolis Welling (01-01-2013). Tempo interativo (Ph.D.). La Jolla: Universidade da Califórnia, San Diego. ISBN 9781303194450.
  5. ^ Barnet, Belinda (01-12-2014). Máquinas de memória: a evolução do hipertexto . Anthem Press. p. 108. ISBN 9781783083442. Mas o desenvolvimento mais popular para usuários novatos no FRESS não foi sua capacidade de acomodar vários monitores e usuários; era o recurso 'desfazer' - o recurso do qual van Dam mais se orgulha (van Dam 2011). FRESS foi o pioneiro em desfazer em um único nível para processamento de texto e hipertexto. Cada edição em um arquivo era salva em uma versão sombreada da estrutura de dados, que permitia um 'salvamento automático' e um desfazer. A equipe e os alunos da Brown compreenderam imediatamente a importância e a utilidade desse recurso (van Dam, 1999).
  6. ^ Barnet, Belinda (01-01-2010). "Criação da interface de documento centrada no usuário: o sistema de edição de hipertexto (HES) e o sistema de recuperação e edição de arquivos (FRESS)" . 4 (1). Citar diário requer |journal=( ajuda )
  7. ^ Teitelman, Warren (1972-01-01). "Programação automatizada: o assistente do programador". Proceedings of the December 5-7, 1972, Fall Joint Computer Conference, Part II . AFIPS '72 (outono, parte II). New York, NY, USA: ACM: 917–921. doi : 10.1145 / 1480083.1480119 .
  8. ^ "Bravo Manual in Alto para não-programadores, p. 52" (PDF) . Página visitada em 29/03/2014 .
  9. ^ Miller, Lance A .; Thomas, John C. (01/09/1977). “Questões comportamentais na utilização de sistemas interativos”. Jornal Internacional de Estudos Homem-Máquina . 9 (5): 509–536. doi : 10.1016 / S0020-7373 (77) 80002-3 . ISSN  0020-7373 .
  10. ^ Miller, Lance A .; John C. Thomas Jr. (dezembro de 1976). "Problemas comportamentais no uso de sistemas interativos" (PDF) . Página visitada em 2011-05-21 . Citar diário requer |journal=( ajuda )
  11. ^ a b c Ben Zimmer (2009-09-15). "The Age of Undoing" . New York Times . Recuperado 2013-06-02 .
  12. ^ Apple Computer, Inc. (1984). "Interface de usuário". Inside Macintosh, Volume I .
  13. ^ Roberta Mancini, Alan Dix e Stefano Levialdi. 2006. "Reflexões sobre Desfazer"
  14. ^ a b c Padrões de projeto: elementos de software orientado a objetos reutilizáveis . Gamma, Erich. Reading, Mass .: Addison-Wesley. 1995. ISBN 0201633612. OCLC  31171684 .CS1 maint: others ( link )

links externos