En este artículo (4 apartados)
Todos usamos Ctrl+Z decenas de veces al día, y de ahí viene el nombre del canal Control Z (Ctrl-Zeta). Pero ¿cómo sabe un programa qué tiene que deshacer? En este artículo vemos la idea que hay detrás y cómo programarla tú mismo.
La pila de deshacer
La mayoría de editores guardan cada cambio en una pila (estructura LIFO: el último en entrar es el primero en salir). Al pulsar Ctrl+Z se saca el último cambio de la pila de deshacer y se mete en una segunda pila, la de rehacer (Ctrl+Y o Ctrl+Mayús+Z, según el programa). Si haces un cambio nuevo después de deshacer, la pila de rehacer se vacía.
El patrón Command
Una forma clásica de implementarlo es el patrón de diseño Command: cada acción es un objeto con dos métodos, ejecutar() y deshacer().
class Historial {
constructor() { this.deshacer = []; this.rehacer = []; }
hacer(cmd) { cmd.ejecutar(); this.deshacer.push(cmd); this.rehacer = []; }
undo() { const c = this.deshacer.pop(); if (c) { c.deshacer(); this.rehacer.push(c); } }
redo() { const c = this.rehacer.pop(); if (c) { c.ejecutar(); this.deshacer.push(c); } }
}
Otra opción: guardar instantáneas
En lugar de guardar acciones, se puede guardar una copia del estado completo antes de cada cambio (patrón Memento). Es más sencillo pero gasta más memoria, por eso muchos programas limitan el número de pasos de deshacer.
¿Y la IA?
Los asistentes de programación con IA también necesitan un «Ctrl+Z»: editores como Cursor guardan puntos de control para volver atrás los cambios que propone el agente. La idea es la misma: no aplicar nada que no puedas revertir.
¿Quieres verlo en vídeo? Suscríbete a Control Z en YouTube.