Pregunta

Leí lo siguiente en un artículo

  

Los objetos inmutables son particularmente   útil para implementar ciertos comunes   modismos como deshacer / rehacer y abortable   actas. Tomar deshacer por ejemplo. UNA   técnica común para implementar deshacer   es mantener una pila de objetos que   de alguna manera saber cómo ejecutar cada comando   a la inversa (el llamado "Comando"   Patrón "). Sin embargo, descubrir cómo   ejecutar un comando en reversa puede ser   difícil. Una técnica más simple es   mantener una pila de objetos inmutables   representando el estado del sistema   entre comandos sucesivos. Entonces, a   deshacer un comando, simplemente revierte   al estado anterior del sistema (y   probablemente almacene el estado actual en   la pila de rehacer).

Sin embargo, el artículo no muestra un buen ejemplo práctico de cómo los objetos inmutables podrían usarse para implementar " deshacer " operaciones Por ejemplo ... eliminando 10 correos electrónicos de una bandeja de entrada de gmail. Una vez que haces eso, tiene una opción de deshacer. ¿Cómo ayudaría un objeto inmutable a este respecto?

¿Fue útil?

Solución

Los objetos inmutables contendrían todo el estado del sistema, por lo que en este caso tendría el objeto A que contiene la bandeja de entrada original, y luego el objeto B que contiene la bandeja de entrada con diez correos electrónicos eliminados y (en efecto ) un puntero hacia atrás de B a A que indica que, si hace una '' deshacer '', entonces deja de usar B como el estado del sistema y comienza a usar A en su lugar.

Sin embargo, las bandejas de entrada de Gmail son demasiado grandes para usar esta técnica. Lo usaría en documentos que realmente pueden almacenarse en una cantidad bastante pequeña de memoria, de modo que pueda guardar muchos de ellos para deshacer en varios niveles.

Si desea mantener diez niveles de deshacer, puede potencialmente ahorrar memoria manteniendo solo dos objetos inmutables: uno que es actual y otro que es de diez '' deshacer '' ago - y una lista de Comandos que se aplicaron entre ellos.

Para hacer un " deshacer " ;, vuelve a ejecutar todos los objetos excepto el último Comando, úselo como el nuevo objeto actual y borre el último Comando (o guárdelo como un " Rehacer " objeto). Cada vez que realiza una nueva acción, actualiza el objeto actual, agrega el comando asociado a la lista y luego (si la lista tiene más de diez comandos) ejecuta el primer comando en el objeto desde el inicio de la lista de deshacer y tira el primer Comando de la lista.

También puede hacer varios otros sistemas de puntos de verificación, que incluyen un número variable de representaciones completas del sistema, así como un número variable de Comandos entre ellos. Pero se aleja cada vez más de la idea original que citó y se parece cada vez más a un sistema mutable típico. Sin embargo, evita el problema de hacer que los comandos sean constantemente reversibles; solo necesita aplicar comandos a un objeto hacia adelante y no hacia atrás.

SVN y otros sistemas de control de versiones son efectivamente una forma de deshacer y rehacer basada en disco o red.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top