
Deshacer es una técnica de interacción implementada en muchos programas informáticos . Borra el último cambio realizado en el documento , revirtiéndolo a un estado anterior. En algunos programas más avanzados, como los de procesamiento gráfico , deshacer anula el último comando aplicado al archivo que se está editando. Gracias a la posibilidad de deshacer, [ 1 ] los usuarios pueden explorar y trabajar sin temor a cometer errores, ya que estos se pueden deshacer fácilmente.
Las expectativas para la función de deshacer son fáciles de entender: tener una funcionalidad predecible e incluir todos los comandos "deshacerables". [ 2 ] Normalmente, la función de deshacer está disponible hasta que el usuario deshace 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 un archivo no se puede deshacer, pero se agrega a la lista para mostrar que se ejecutó. Otra acción que normalmente no se almacena y, por lo tanto, no se puede deshacer, es el desplazamiento o la selección . [ 3 ]
Lo opuesto a deshacer es rehacer . El comando rehacer revierte la acción de deshacer o actualiza el búfer a un estado más reciente.
Los componentes comunes de la funcionalidad de deshacer son los comandos ejecutados por el usuario, el/los búfer/es de historial que almacena/n las acciones completadas, el gestor de deshacer/rehacer para controlar el búfer de historial y la interfaz de usuario para interactuar con el usuario. [ 4 ]
En la mayoría de las aplicaciones gráficas de la mayoría de los sistemas operativos principales (como Microsoft Windows , Linux y BSD ), el atajo de teclado para deshacer es Ctrl+Z , y el atajo para rehacer es + o + + . En la mayoría de las aplicaciones de macOS , el atajo para el comando deshacer es + , y el atajo para rehacer es + + . En todas las plataformas, también se puede acceder a las funciones de deshacer/rehacer a través del menú Editar .CtrlYCtrl⇧ ShiftZ⌘ CommandZ⌘ Command⇧ ShiftZ
Historia
La capacidad de deshacer una operación en una computadora se inventó de forma independiente varias veces, en respuesta a cómo las personas usaban las computadoras. [ 5 ]
Se informa que el Sistema de Recuperación y Edición de Archivos , desarrollado a partir de 1968 en la Universidad de Brown , fue el primer sistema informático que contó con una función de "deshacer". [ 6 ] [ 7 ]
Warren Teitelman desarrolló un Asistente del Programador como parte de BBN-LISP con una función de deshacer, hacia 1971. [ 8 ]
En su tesis doctoral (Ejecución reversible como herramienta de diagnóstico) de 1971 en la Universidad de Cornell, Marvin Zelkowitz propuso el concepto de ejecución reversible, que es esencialmente una función de deshacer. En su tesis doctoral (Sistema de análisis interactivo para errores de ejecución) de 1975 en la Universidad de Illinois en Urbana-Champaign , Alan M. Davis amplió el concepto de Zelkowitz para demostrar cómo se podría utilizar la función de deshacer multinivel (es decir, la ejecución reversible multinivel) para depurar programas informáticos.
El editor de texto Xerox PARC Bravo tenía un comando Deshacer en 1974. [ 9 ] Un informe de investigación de 1976 de Lance A. Miller y John C. Thomas de IBM , Problemas de comportamiento en el uso de sistemas interactivos , [ 10 ] señaló que "sería bastante útil permitir a los usuarios 'retirar' al menos el comando inmediatamente anterior (mediante la emisión de algún comando 'deshacer' especial)". [ 11 ] 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 . [ 12 ] 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 deshacer como un elemento estándar en la Apple Lisa . Atkinson logró convencer a los desarrolladores individuales del software de la aplicación Lisa de que incluyeran un solo nivel de deshacer y rehacer, pero no tuvo éxito al presionar para que se incluyeran varios niveles. Cuando Apple presentó el sucesor de Lisa, el Macintosh , estipuló que todas las aplicaciones estándar debían incluir un "Deshacer" como primer comando en el menú "Editar" [ 13 ] , lo cual se ha mantenido como estándar en macOS y Windows hasta el día de hoy.
Los comandos de deshacer multinivel se introdujeron en la década de 1980, lo que permitía a los usuarios revertir una serie de acciones, no solo la más reciente. [ 12 ] EMACS y otros editores de pantalla de tiempo compartido lo tenían antes que el software de las computadoras personales . CygnusEd fue el primer editor de texto de Amiga con una función de deshacer/rehacer ilimitada. 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 de recuperación. [ 12 ] 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. [ 2 ]
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". [ 4 ]
- ejecución estable debilitada: esto significa que si se ejecuta la acción de deshacer, todos los comandos que dependen del comando deshecho se deshacen dependiendo de ese comando.
- Propiedad de resultado estable: Esta propiedad tiene un significado similar a la propiedad de ejecución estable, excepto por la lista. La lista ordenada de comandos indica que fueron ejecutados, en lugar de solo los comandos.
- Conmutativo: Esto significa que el estado alcanzado después de deshacer y rehacer dos comandos diferentes es el mismo cuando se ejecutan en orden inverso.
- Propiedad de deshacer minimalista: Describe que "la operación de deshacer del comando C deshace solo el comando C y todos los comandos posteriores a C que dependen de C". [ 4 ]
Deshacer lineal
La función de deshacer lineal se implementa con una pila ( estructura de datos LIFO, último en entrar, primero en salir ) que almacena un historial de todos los comandos ejecutados. Cuando se ejecuta un nuevo comando, se añade a la parte superior de la pila. Por lo tanto, solo el último comando ejecutado puede deshacerse y eliminarse del historial. La función de deshacer puede repetirse siempre que el historial no esté vacío. [ 2 ]
Modelo lineal restringido
El modelo lineal restringido es una extensión del modelo de deshacer lineal. Satisface la propiedad de ejecución estable descrita anteriormente para el deshacer lineal, ya que este modelo no conserva dicha propiedad si se ejecuta un comando mientras la lista de historial incluye otros comandos. El modelo lineal restringido borra la lista de historial antes de agregar un nuevo comando. Sin embargo, también existen otras restricciones. Por ejemplo, se puede restringir el tamaño de la lista de historial o, cuando se alcanza un tamaño definido, se elimina de la lista el primer comando ejecutado. [ 2 ]
Deshacer no lineal
La principal diferencia entre la función de deshacer lineal y la no lineal radica en la posibilidad que tiene el usuario de deshacer los comandos ejecutados en un orden arbitrario. Puede deshacer no el comando más reciente, sino elegir uno de la lista. [ 4 ] Para el modelo no lineal existen subclases que implementan este modelo.
Modelo de script
El modelo de script maneja las acciones del usuario como la edición de un script de comandos. La lista histórica de los comandos ejecutados se interpreta "como un script, el efecto de deshacer se define como el mismo que si la acción deshecha nunca hubiera ocurrido". [ 2 ] Como resultado de deshacer, el estado debe ser como si el comando deshecho 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 subsiguientes se rehacen en un estado diferente al que se ejecutaron originalmente en las interfaces de manipulación directa, esta reinterpretación de la acción original del usuario no siempre es obvia o está bien definida". [ 2 ]
Modelo US&R
La característica especial de este modelo es que permite omitir comandos. Esto significa que se puede omitir la repetición de un comando. El comando omitido se marca como tal, pero no se elimina. Al ejecutar nuevos comandos, se conserva el historial, lo que permite reproducir el orden de ejecución. Este orden se puede describir mediante un árbol de historial, que es un grafo dirigido, ya que permite continuar rehaciendo comandos desde otra rama, creando un enlace en el grafo. [ 2 ] Si bien el conjunto de comandos es sencillo y fácil de entender, la compleja estructura con omisión y enlaces entre ramas dificulta su comprensión y memorización cuando el usuario desea deshacer más de un paso. [ 2 ]
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 coloca el último comando de la lista de rehacer delante de ella. Por un lado, esto significa que el siguiente comando a rehacer se puede seleccionar colocándolo delante. Por otro lado, la rotación se puede usar "para seleccionar el lugar en la lista de rehacer donde la siguiente operación de deshacer colocará el comando". [ 2 ] La lista de rehacer no está ordenada. "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". [ 2 ] Para rehacer, la lista tiene que rotarse hasta que el comando deseado esté arriba.
Deshacer selectivo
Jakubec et al. dicen que el deshacer selectivo es una característica que un modelo puede ofrecer, pero para el deshacer selectivo no hay una definición clara. [ 4 ] Los autores seleccionaron funciones que un modelo debería tener cuando admite el deshacer selectivo. Debería ser posible "deshacer cualquier acción ejecutada en el búfer de historial. Las acciones independientes de la acción que se está deshaciendo deberían dejarse intactas". [ 4 ] De igual manera, rehacer debe ser posible para cualquier comando deshecho. La tercera función para el deshacer selectivo es que "ningún comando puede descartarse automáticamente del búfer de historial sin una solicitud directa del usuario". [ 4 ] Para el deshacer selectivo se aplica que deshacer y rehacer son ejecutables fuera de cualquier contexto. Hay tres problemas principales. El primero 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 pueden deshacerse y, por lo tanto, debe resolverse qué estado después de deshacer se presentará. El tercer problema son los problemas de descarte de comandos. El deshacer selectivo no tiene puntero en las listas, por lo que esto significa que ningún comando debe descartarse de la pila. [ 4 ]
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, la ejecuta y la agrega a la lista de historial. Se definen dos operaciones no lineales, deshacer selectivo y rehacer selectivo, lo que lo hace más simétrico. [ 2 ]
Aplicación multiusuario
Cuando varios usuarios pueden editar el mismo documento simultáneamente, se necesita una función de deshacer multiusuario. El deshacer multiusuario global revierte la última acción realizada en el documento, independientemente de quién la haya editado. El deshacer multiusuario local solo revierte las acciones realizadas por el usuario local, lo que requiere una implementación de deshacer no lineal.
Mientras que la función de deshacer permite retroceder en varias ediciones, la función de rehacer avanza en el historial de acciones. Al realizar una nueva edición, generalmente se borra la lista de rehacer. Si se utiliza un modelo de rehacer ramificado, la nueva edición ramifica el historial de acciones.
El número de acciones previas que se pueden deshacer varía según el programa, la versión y las capacidades del hardware o software. Por ejemplo, el tamaño predeterminado de la pila de deshacer/rehacer en Adobe Photoshop es de 20, pero el usuario puede modificarlo. 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 de deshacer de edición única, simplistas, a veces eliminan la opción de "rehacer" al tratar el comando de deshacer como una acción que se puede deshacer. Esto se conoce como el modelo de deshacer de inversión, ya que el usuario puede alternar entre dos estados del programa usando el comando de deshacer. [ 14 ] Este era el modelo estándar antes de la adopción generalizada del deshacer multinivel a principios de la década de 1990.
Deshacer implementación
La funció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 la información de la operación en objetos de comando. Esto significa que cada acción se almacena en un objeto. La clase abstracta de comando implementa una operación abstracta de ejecución, por lo que cada objeto de comando tiene una operación de ejecución. Para deshacer, también debe existir una operación de deshacer, que revierte el efecto del comando ejecutado y que se almacena en una lista de historial. Las operaciones de deshacer y rehacer se implementan de manera que la lista se recorre hacia adelante y hacia atrás cuando se llama al comando de ejecución o deshacer. [ 15 ]
Para la función de deshacer simple, solo se almacena el comando ejecutado. En contraste con la función de deshacer multinivel, donde no solo se guarda la lista de historial con los comandos, sino que también se puede determinar el número de niveles de deshacer de la longitud máxima de la lista. [ 15 ]
Patrón Memento
Con el patrón memento, se almacena el estado interno de un objeto. El objeto donde se guarda el estado se denomina memento y se organiza mediante el originador del memento. Este devuelve un memento, inicializado con información del estado actual, cuando se ejecuta la operación de deshacer, para que se pueda verificar dicho estado. El memento solo es visible para el originador.
En el patrón memento, el mecanismo de deshacer se denomina custodio. Es responsable de la custodia de los mementos, pero nunca modifica su contenido. Para deshacer, el custodio solicita un memento al creador y luego aplica la acción de deshacer. [ 15 ]
La mayor parte del mecanismo de deshacer se puede implementar sin depender de aplicaciones o clases de comandos específicas. Esto incluye "la gestión de la lista de historial, el desplazamiento del historial, las entradas de menú para deshacer y rehacer, y la actualización de las entradas de menú según el nombre del siguiente comando disponible". [ 2 ]
Cada clase de comando tiene un método `do` que se llama cuando se ejecuta un comando. El método `undo` implementa la operación inversa del método `do`. Para implementar la operación inversa, existen varias estrategias diferentes.
- Punto de control completo : Esto significa que el estado completo se guarda después de ejecutar un comando. Esta es la implementación más sencilla, pero no es muy eficiente y, por lo tanto, no se usa con frecuencia.
- Repetición completa: Por lo tanto, el estado inicial se guarda y se puede acceder a cada estado de la lista de historial "comenzando con el estado inicial y rehaciendo todos los comandos desde el principio del historial". [ 2 ]
- Punto de control parcial : Esta es la estrategia más utilizada. El estado modificado de la aplicación se guarda y, al deshacerlo, parte del estado se restablece al valor anterior.
- Función inversa: La función inversa no necesita información de estado guardado. "Por ejemplo, el movimiento se puede revertir moviendo el objeto hacia atrás en una cantidad relativa." [ 2 ] Para deshacer selectivo no hay suficiente información para guardar el estado.
Véase también
Referencias
- ↑ Myrtus (31/01/2026). "La opción de deshacer cambió lo que se siente arriesgado" . crumbs.top . Consultado el 07/02/2026 .
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Berlage, Thomas (1994-09-01). "Un mecanismo de deshacer selectivo para interfaces gráficas de usuario basado en objetos de comando". ACM Transactions on Computer-Human Interaction . 1 (3): 269– 294. doi : 10.1145/196699.196721 . ISSN 1073-0516 . S2CID 11848679 .
- ↑ Myers, Brad A.; Kosbie, David S. (13 de abril de 1996). «Objetos de comando jerárquicos reutilizables» . Actas de la conferencia SIGCHI sobre factores humanos en sistemas informáticos: puntos en común - CHI '96 . ACM. págs. 260-267 . doi : 10.1145/238386.238526 . ISBN 0897917774. S2CID 17033810 .
- 1 2 3 4 5 6 7 8 Jakubec, Karel; Polák, Marek; Nečaský, Martín; Holubová, Irena (2014). "Deshacer/Rehacer operaciones en entornos complejos" . Procedia Ciencias de la Computación . 32 : 561– 570. doi : 10.1016/j.procs.2014.05.461 . ISSN 1877-0509 .
- ↑ Moran, Chuktropolis Welling (1 de enero de 2013). Tiempo interactivo (Tesis doctoral). La Jolla: Universidad de California, San Diego. ISBN 9781303194450Archivado del original el 28-04-2021 . Consultado el 07-07-2016 .
- ↑ Barnet, Belinda (1 de diciembre de 2014). Memory Machines: The Evolution of Hypertext . Anthem Press. pág. 108. ISBN 9781783083442Pero
la característica más popular entre los usuarios novatos de FRESS no fue su capacidad para admitir múltiples pantallas y usuarios, sino la función de deshacer, de la que van Dam se siente más orgulloso (van Dam 2011). FRESS fue pionero en la función de deshacer de un solo nivel tanto para el procesamiento de texto como para el hipertexto. Cada edición de un archivo se guardaba en una copia de seguridad de la estructura de datos, lo que permitía tanto el autoguardado como la función de deshacer. El personal y los estudiantes de Brown comprendieron de inmediato la importancia y la utilidad de esta función (van Dam 1999).
- ↑ Barnet, Belinda (1 de enero de 2010). "Creació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)" . Digital Humanities Quarterly . 4 (1). Archivado del original el 1 de mayo de 2021. Recuperado el 27 de mayo de 2016 .
- ↑ Teitelman, Warren (1972-01-01). "Programación automatizada: El asistente del programador". Actas de la conferencia conjunta de informática de otoño del 5 al 7 de diciembre de 1972, Parte II - AFIPS '72 (Otoño, parte II) . Nueva York, NY, EE. UU.: ACM. págs. 917–921 . doi : 10.1145/1480083.1480119 . S2CID 1276566 .
- ↑ "Manual de Bravo en la Guía para no programadores de Alto, pág. 52" (PDF) . Archivado (PDF) del original el 5 de mayo de 2015. Consultado el 29 de marzo de 2014 .
- ↑ Miller, Lance A.; Thomas, John C. (1977-09-01). "Problemas de comportamiento en el uso de sistemas interactivos". International Journal of Man-Machine Studies . 9 (5): 509– 536. doi : 10.1016/S0020-7373(77)80002-3 . ISSN 0020-7373 .
- ↑ Miller, Lance A.; John C. Thomas Jr. (diciembre de 1976). "Problemas de comportamiento en el uso de sistemas interactivos" . Archivado del original (PDF) el 27 de mayo de 2012. Recuperado el 21 de mayo de 2011 .
- 1 2 3 Ben Zimmer (15 de septiembre de 2009). "La era de la destrucción" . New York Times . Archivado del original el 17 de junio de 2013. Recuperado el 2 de junio de 2013 .
- ↑ Apple Computer, Inc. (1984). "Interfaz de usuario". Dentro de Macintosh, Volumen I.
- ↑ Roberta Mancini, Alan Dix y Stefano Levialdi. 2006. "Reflexiones sobre deshacer"
- 1 2 3 Erich Gamma; Richard Helm; Ralph Johnson; John Vlissides (1995). Patrones de diseño . Reading, Mass.: Addison-Wesley. ISBN 0201633612OCLC 31171684
Lecturas adicionales
- Zimmer, Ben (15 de septiembre de 2009). "La era de la destrucción" . The New York Times . Archivado del original el 30 de noviembre de 2011.
Enlaces externos
Definición de deshacer en el diccionario Wikcionario
- Características del editor de texto
- Computación reversible
- Introducciones relacionadas con la informática en 1968