15 · cada efecto, su inversa
Efectos revertibles
Si cada cambio viene con instrucciones de cómo deshacerlo, retirar una pieza deja de ser un problema.
La idea central es sencilla de enunciar. Toda modificación del entorno viaja emparejada con su operación inversa y el sistema la guarda.
Cargar una pieza es aplicar una secuencia de cambios y apilar sus inversas. Descargarla es aplicar esa pila. Nada más.
Un efecto y su inversa
Y hay un detalle de ergonomía que el artículo subraya: quien programa solo escribe la inversa de cada operación pequeña. La inversa del conjunto la deriva el sistema.
El caso fácil y el caso real
Deshacer en el orden contrario al de aplicación funciona siempre y no exige ninguna condición. Cada inversa se encuentra exactamente el estado que produjo su propia aplicación.
El problema es que los sistemas reales no deshacen en ese orden. Retiras una pieza del medio mientras las demás siguen funcionando. O varias piezas han ido intercalando sus cambios y ahora las inversas de una están separadas por los cambios de otra.
En esos casos, la inversa se encuentra un estado que otros han movido. Y ahí es donde hace falta una condición.
La condición
El artículo la llama independencia y tiene dos partes.
- Primera parte Que conmuten Las operaciones de una pieza y las de otra dan el mismo resultado en cualquier orden.
- Segunda parte Que no se pisen las inversas Ninguna de las dos altera la inversa que produce la otra. Casi todos los resúmenes omiten esta mitad.
Cuando eso se cumple para cada par, el resultado es el que sostiene todo lo demás: se puede deshacer en cualquier orden y el sistema vuelve al estado inicial.
Un registro de suscriptores a un evento cumple la condición: dos altas dan el mismo resultado en cualquier orden. Una cadena de filtros ordenada no la cumple.
Un matiz de honestidad
El artículo admite que hablar de volver al estado inicial es una idealización, porque el estado físico no se recupera tal cual.
Liberar memoria devuelve un bloque, pero no restaura cómo estaba organizada la memoria antes de pedirlo. Un identificador generado no vuelve por descartarlo, porque la siguiente creación toma uno nuevo.
Por eso todas las igualdades se leen en términos de lo que un observador puede distinguir. Y leerlo así no es rebajar el resultado: es lo que lo hace alcanzable, porque dos operaciones pueden dejar estados indistinguibles y contar como equivalentes.