Deshacer - Undo

Deshacer es una técnica de interacción que se implementa en muchos programas de computadora. Borra el último cambio realizado en el documento, revirtiéndolo a un estado anterior. En algunos programas más avanzados, como el procesamiento de gráficos , deshacer anulará el último comando realizado en el archivo que se está editando. Con la posibilidad de deshacer, los usuarios pueden explorar y trabajar sin miedo a cometer errores, ya que se pueden deshacer fácilmente.

Las expectativas para deshacer son fáciles de entender: tener una funcionalidad predecible e incluir todos los comandos "deshacer". Por lo general, deshacer está disponible hasta que el usuario deshaga todas las operaciones ejecutadas. Pero hay algunas acciones que no se almacenan en la lista de deshacer y, por lo tanto, no se pueden deshacer. Por ejemplo, guardar archivo no se puede deshacer, pero está en la cola de la lista para mostrar que se ejecutó. Otra acción que generalmente no se almacena y, por lo tanto, no se puede deshacer, es el desplazamiento o la selección .

Lo opuesto a deshacer es rehacer . El comando rehacer invierte el deshacer o avanza el búfer a un estado más reciente.

Los componentes comunes de la funcionalidad de deshacer son los comandos que fueron ejecutados por el usuario, el búfer del historial que almacena las acciones completadas, el administrador de deshacer / rehacer para controlar el búfer del historial y la interfaz de usuario para interactuar con el usuario.

En la mayoría de las aplicaciones de Microsoft Windows , el atajo de teclado para el comando deshacer es Ctrl + Z o Alt + Retroceso, y el atajo para rehacer es Ctrl + Y o Ctrl + Shift + Z.

En la mayoría de las aplicaciones de Apple Macintosh , el atajo para el comando deshacer es Comando -Z, y el atajo para rehacer es Comando - Mayús -Z.

En todas las plataformas, también se puede acceder a las funciones de deshacer / rehacer a través del menú Editar .

Historia

La capacidad de deshacer una operación en una computadora se inventó de forma independiente varias veces, en respuesta a la forma en que las personas usaban las computadoras.

Se informa que el Sistema de Recuperación y Edición de Archivos , desarrollado a partir de 1968 en la Universidad de Brown , es el primer sistema basado en computadora que tiene una función de "deshacer".

Warren Teitelman desarrolló un asistente de programador como parte de BBN-LISP con función Deshacer, en 1971.

El editor de texto Xerox PARC Bravo tenía un comando Deshacer en 1974. Un informe de investigación de 1976 de Lance A. Miller y John C. Thomas de IBM , Behavioral Issues in the Use of Interactive Systems , señaló que "sería muy útil permitir a los usuarios para 'recuperar' al menos el comando inmediatamente anterior (emitiendo algún comando especial 'deshacer') ". Los programadores del centro de investigación Xerox PARC asignaron el atajo de teclado Ctrl-Z al comando deshacer, que se convirtió en una característica crucial de los editores de texto y procesadores de texto en la era de las computadoras personales . En 1980, Larry Tesler de Xerox PARC comenzó a trabajar en Apple Computer . Allí, él y Bill Atkinson abogaron por la presencia de un comando de deshacer como un accesorio estándar en el Apple Lisa . Atkinson pudo convencer a los desarrolladores individuales del software de aplicación de Lisa para que incluyeran un solo nivel de deshacer y rehacer, pero no logró cabildear en varios niveles. Cuando Apple presentó el sucesor de Lisa, el Macintosh , estipuló que todas las aplicaciones estándar deberían incluir un "Deshacer" como el primer comando en el menú "Editar", que sigue siendo el estándar en macOS y Windows hasta el día de hoy.

Los comandos de deshacer de varios niveles se introdujeron en la década de 1980, lo que permite a los usuarios recuperar una serie de acciones, no solo la más reciente. EMACS y otros editores de pantallas de tiempo compartido lo tenían antes que el software de computadora personal. CygnusEd fue el primer editor de texto de Amiga con una función ilimitada de deshacer / rehacer. AtariWriter , una aplicación de procesamiento de texto introducida en 1982, incluía deshacer. NewWord, otro programa de procesamiento de texto lanzado por NewStar en 1984, tenía un comando unerase. VisiWord de IBM también tenía un comando de recuperación.

Deshacer y rehacer modelos

Los modelos de deshacer se pueden clasificar como lineales o no lineales. El modelo de deshacer no lineal se puede subclasificar en modelo de script, modelo us & r, modelo triádico y deshacer selectivo.

Algunas propiedades comunes de los modelos son:

  • propiedad de ejecución estable: un estado se representa como una lista ordenada de comandos. Esto significa que un comando "siempre se deshace en el estado que se alcanzó después de la ejecución original".
  • ejecución estable debilitada: Esto significa que si se ejecuta deshacer, todos los comandos que dependen del comando deshecho se deshacen dependiendo del comando.
  • Propiedad de resultado estable: esta propiedad tiene un significado similar al de la propiedad de ejecución estable, excepto por la lista. La lista ordenada de comandos incluye que se ejecutaron en lugar de solo los comandos.
  • conmutativo: Eso significa que el estado alcanzado después de deshacer y rehacer dos comandos diferentes es el mismo cuando se ejecutan en el orden inverso.
  • Propiedad de deshacer minimalista: Describe que "deshacer la operación del comando C deshace solo el comando C y todos los comandos anteriores a C que dependen de C."

Deshacer lineal

El deshacer lineal se implementa con una pila (estructura de datos de último en entrar, primero en salir (LIFO)) que almacena un historial de todos los comandos ejecutados. Cuando se ejecuta un nuevo comando, se agrega a la parte superior de la pila. Por lo tanto, solo el último comando ejecutado se puede deshacer y eliminar del historial. Deshacer se puede repetir siempre que el historial no esté vacío.

Modelo lineal restringido

El modelo lineal restringido es un aumento del modelo de deshacer lineal. Satisface la propiedad de ejecución estable descrita anteriormente para deshacer lineal, porque este modelo no mantiene la propiedad si se realiza un comando mientras que la lista del historial incluye otros comandos. El modelo lineal restringido borra la lista del historial antes de que se agregue un nuevo comando. Pero también hay otras restricciones disponibles. Por ejemplo, el tamaño de la lista del historial se puede restringir o cuando se alcanza un tamaño definido, el primer comando ejecutado se elimina de la lista.

Deshacer no lineal

La principal diferencia entre deshacer lineal y deshacer no lineal es la posibilidad de que el usuario deshaga los comandos ejecutados en un orden arbitrario. Tienen la oportunidad de deshacer no el comando más reciente, sino elegir un comando de la lista. Para el modelo no lineal hay subclases que implementan este modelo.

Modelo de secuencia de comandos

El modelo de secuencia de comandos maneja las acciones del usuario como editar una secuencia de comandos. La lista del historial de los comandos ejecutados se interpreta "como un script, el efecto de deshacer se define como el mismo que si la acción de deshacer nunca hubiera ocurrido en primer lugar". Como resultado de deshacer, el estado tiene que ser como si el comando de deshacer nunca se hubiera ejecutado. Una desventaja de este modelo es que el usuario debe conocer la conexión entre el comando deshecho y el estado actual para evitar efectos secundarios. Uno de estos puede ser, por ejemplo, la duplicación. Otros problemas son que si "los comandos posteriores se rehacen en un estado diferente al que originalmente se ejecutaron en interfaces de manipulación directa, esta reinterpretación de la acción original del usuario no siempre es obvia o bien definida".

Modelo US&R

La característica especial de este modelo es que tiene la opción de omitir un comando. Esto significa que se puede omitir rehacer un comando. El comando que se omite se marca como omitido pero no se elimina. Cuando se ejecutan nuevos comandos, la lista del historial se conserva, por lo que el orden de los comandos ejecutados se puede reproducir con eso. El orden se puede describir a través de un árbol histórico que es un gráfico dirigido, "porque es posible seguir rehaciendo comandos desde otra rama creando un vínculo en el gráfico". Aunque el conjunto de comandos es simple y fácil de entender, la estructura compleja con saltos y enlaces de ramas es difícil de comprender y recordar, cuando el usuario quiere deshacer más de un paso.

Modelo triádico

Este modelo de deshacer no lineal tiene además de deshacer y rehacer la posibilidad de rotar. Tiene la misma estructura de datos que los modelos mencionados anteriormente con una lista de historial y una lista de rehacer separada que incluye las operaciones de rehacer. La operación de rotación establece el último comando de la lista de rehacer delante de él. Por un lado, esto significa que el siguiente comando a rehacer se puede seleccionar colocándolo al frente. Por otro lado, la rotación se puede utilizar "para seleccionar el lugar en la lista de rehacer donde la siguiente operación de deshacer colocará el comando". Por tanto, la lista de rehacer está desordenada. "Para deshacer un comando aislado, el usuario tiene que deshacer una serie de pasos, rotar la lista de rehacer y luego rehacer una serie de pasos". Para rehacer, la lista debe rotarse hasta que el comando deseado esté arriba.

Deshacer selectivo

Jakubec y col. dicen que el deshacer selectivo es una característica que puede ofrecer un modelo, pero para el deshacer selectivo no hay una definición clara. Los autores seleccionaron las funciones que debería tener un modelo cuando admite deshacer selectivamente. Debería ser posible "deshacer cualquier acción ejecutada en el búfer del historial. Las acciones independientes de la acción que se está deshaciendo deben dejarse intactas". Así como eso, rehacer tiene que ser posible para cualquier comando deshecho. La tercera función para deshacer selectivamente es que "ningún comando puede descartarse automáticamente del búfer del historial sin una solicitud directa del usuario". Para deshacer selectivamente, se aplica que deshacer y rehacer es ejecutable fuera de cualquier contexto. Hay tres cuestiones principales. La primera es que los comandos deshechos pueden estar fuera del contexto original. A través de esto, puede haber referencias muertas que deben manejarse. El segundo problema es que los comandos modificados se pueden deshacer y, por lo tanto, debe resolverse qué estado se presentará después de deshacer. El tercer problema es descartar los problemas de mando. El deshacer selectivo no tiene puntero en las listas, por lo que esto significa que no se debe descartar ningún comando de la pila.

Deshacer selectivo directo

El deshacer selectivo directo es una extensión del deshacer lineal restringido con un árbol de historial. La operación crea una copia del comando seleccionado, lo ejecuta y lo agrega a la lista del historial. Allí se definen dos operaciones no lineales deshacer selectivo y rehacer selectivo, por lo que es más simétrico.

Aplicación multiusuario

Cuando varios usuarios pueden editar el mismo documento simultáneamente, se necesita deshacer para varios usuarios. Deshacer multiusuario global revierte la última acción realizada en el documento, independientemente de quién realizó la edición. El deshacer multiusuario local solo revierte las acciones realizadas por el usuario local, lo que requiere una implementación de deshacer no lineal.

Donde deshacer se puede usar para retroceder a través de múltiples ediciones, el comando rehacer avanza a través del historial de acciones. Hacer una nueva edición normalmente borra la lista de rehacer. Si se utiliza un modelo de rehacer bifurcado, la nueva edición bifurca el historial de acciones.

El número de acciones anteriores que se pueden deshacer varía según el programa, la versión y las capacidades de hardware o software. Por ejemplo, el tamaño de pila de deshacer / rehacer predeterminado en Adobe Photoshop es 20, pero el usuario puede cambiarlo. Como otro ejemplo, las versiones anteriores de Microsoft Paint solo permitían deshacer hasta tres ediciones; la versión introducida en Windows 7 aumentó este límite a 50.

Las funciones simplistas de deshacer de una sola edición a veces eliminan la función "rehacer" al tratar el comando de deshacer como una acción que se puede deshacer. Esto se conoce como el modelo de deshacer voltear, porque el usuario puede cambiar entre dos estados de programa usando el comando deshacer. Este era el modelo estándar antes de la adopción generalizada de deshacer en varios niveles a principios de la década de 1990.

Deshacer implementación

Deshacer se puede implementar a través de diferentes patrones. Los patrones más comunes son el patrón de comando y el patrón de recuerdo .

Patrón de comando

El patrón de comando es un patrón de diseño de software que encapsula información de la operación en objetos de comando. Esto significa que cada acción se almacena en un objeto. La clase de comando abstracto implementa una operación de ejecución abstracta, por lo que cada objeto de comando tiene una operación de ejecución. Para deshacer también tiene que haber una operación no ejecutada, que deshace el efecto del comando ejecutado, que se almacena en una lista de historial. Deshacer y rehacer se implementan para que la lista se ejecute hacia adelante y hacia atrás cuando se invoca el comando ejecutar o deshacer.

Para deshacer único, solo se almacena el comando ejecutado. A diferencia del deshacer multinivel, donde no solo se guarda la lista del historial con los comandos, sino que también se puede determinar el número de niveles de deshacer a partir de la longitud máxima de la lista.

Patrón de recuerdo

Con el patrón de recuerdo se almacena el estado interno de un objeto. El objeto en el que se guarda el estado se llama recuerdo y se organiza a través del creador del recuerdo. Esto devuelve un recuerdo, inicializado con información del estado actual, cuando se ejecuta deshacer, para que se pueda comprobar el estado. El recuerdo solo es visible para el creador.

En el patrón de recuerdo, el mecanismo de deshacer se llama cuidador. Es responsable de la custodia de los recuerdos pero nunca cambie el contenido de estos. Para deshacer, el cuidador solicita un recuerdo del creador y luego aplica el deshacer.

La mayor parte del mecanismo de deshacer se puede implementar sin depender de aplicaciones o clases de comando específicas. Esto incluye "la gestión de la lista del historial, el desplazamiento del historial, las entradas del menú para deshacer y rehacer y la actualización de las entradas del menú según el nombre del siguiente comando disponible".

Cada clase de comando tiene un método do que se llama cuando se ejecuta un comando. El método deshacer implementa la operación inversa del método do. Para implementar lo contrario, existen varias estrategias diferentes.

  • punto de control completo : eso significa que el estado completo se guarda después de que se ejecuta un comando. Esta es la implementación más sencilla, pero no es muy eficiente y, por lo tanto, no se utiliza con frecuencia.
  • repetición completa: Por lo tanto, se guarda el estado inicial y se puede llegar a todos los estados de la lista del historial "comenzando con el estado inicial y rehaciendo todos los comandos desde el comienzo del historial".
  • punto de control parcial : esta es la estrategia más utilizada. El estado de la aplicación modificado se guarda y con deshacer la parte del estado se vuelve a establecer en el valor de avance.
  • función inversa: la función inversa no necesita información de estado guardada. "Por ejemplo, el movimiento se puede revertir moviendo el objeto hacia atrás en una cantidad relativa". Para deshacer selectivamente no hay suficiente información para salvar el estado.

Ver también

Referencias

  1. a b c d e f g h i j k l m n Berlage, Thomas (1 de septiembre de 1994). "Un mecanismo de deshacer selectivo para interfaces gráficas de usuario basado en objetos de comando". Transacciones ACM sobre la interacción computadora-humano . 1 (3): 269-294. doi : 10.1145 / 196699.196721 . ISSN  1073-0516 .
  2. ^ Myers, Brad A .; Kosbie, David S. (13 de abril de 1996). Objetos de comando jerárquicos reutilizables . ACM. págs.  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). "Deshacer / Rehacer operaciones en entornos complejos" . Procedia Informática . 32 : 561–570. doi : 10.1016 / j.procs.2014.05.461 . ISSN  1877-0509 .
  4. Moran, Chuktropolis Welling (1 de enero de 2013). Tiempo interactivo (Ph.D.). La Jolla: Universidad de California, San Diego. ISBN 9781303194450.
  5. Barnet, Belinda (1 de diciembre de 2014). Máquinas de memoria: la evolución del hipertexto . Anthem Press. pag. 108. ISBN 9781783083442. Pero el desarrollo más popular para los usuarios novatos en FRESS no fue su capacidad para acomodar múltiples pantallas y usuarios; era la característica de 'deshacer', la característica de la que van Dam se enorgullece más (van Dam 2011). FRESS fue pionero en deshacer un solo nivel tanto para el procesamiento de texto como para el hipertexto. Cada edición de un archivo se guardaba en una versión sombra de la estructura de datos, lo que permitía tanto un 'autoguardado' como un deshacer. El personal y los estudiantes de Brown comprendieron de inmediato la importancia y la utilidad de esta característica (van Dam 1999).
  6. Barnet, Belinda (1 de enero de 2010). "Elaboración de la interfaz de documentos centrada en el usuario: el sistema de edición de hipertexto (HES) y el sistema de recuperación y edición de archivos (FRESS)" . 4 (1). Cite journal requiere |journal=( ayuda )
  7. Teitelman, Warren (1 de enero de 1972). "Programación automatizada: el asistente del programador". Actas del 5 al 7 de diciembre de 1972, Conferencia Conjunta de Computación de Otoño, Parte II . AFIPS '72 (otoño, parte II). Nueva York, NY, EE. UU .: ACM: 917–921. doi : 10.1145 / 1480083.1480119 .
  8. ^ "Manual Bravo en la guía de no programadores de Alto, p. 52" (PDF) . Consultado el 29 de marzo de 2014 .
  9. ^ Miller, Lance A .; Thomas, John C. (1 de septiembre de 1977). "Problemas de comportamiento en el uso de sistemas interactivos". Revista Internacional de Estudios Hombre-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. (diciembre de 1976). "Problemas de comportamiento en el uso de sistemas interactivos" (PDF) . Consultado el 21 de mayo de 2011 . Cite journal requiere |journal=( ayuda )
  11. a b c Ben Zimmer (15 de septiembre de 2009). "La era de la destrucción" . New York Times . Consultado el 2 de junio de 2013 .
  12. ^ Apple Computer, Inc. (1984). "Interfaz de usuario". En el Macintosh, Volumen I .
  13. ^ Roberta Mancini, Alan Dix y Stefano Levialdi. 2006. "Reflexiones sobre deshacer"
  14. ^ a b c Patrones de diseño: elementos de software orientado a objetos reutilizable . Gamma, Erich. Reading, Mass .: Addison-Wesley. 1995. ISBN 0201633612. OCLC  31171684 .CS1 maint: otros ( enlace )

enlaces externos