Recuerdo, o memento, es un patrón de diseño de comportamiento que te permite guardar y restaurar el estado anterior de un objeto sin revelar los detalles de su implementación.

¿Qué problema resuelve el patrón recuerdo?

Una vez más, una aplicación con un editor de texto es un buen ejemplo de problemas que resuelve un patrón, en este caso el patrón recuerdo. Este patrón puede ser útil si permites que tus usuarios puedan deshacer cualquier operación realizada en el texto - un característica común y esperada en nuestros tiempos.

La función de “guardar para deshacer”, con clases y objetos guardando snapshots del estado del editor, puede hacer que expongas todos los detalles internos de las clases, volviendolas frágiles, o hacer que restrinjas el acceso a su estado, lo que hace imposible producir snapshots.

Por tanto, te encuentras con problemas causados por una encapsulación rota, en el que objetos intentan hacer más de lo que se supone que deben hacer.

Para resolverlo, el patrón Recuerdo delega la creación de snapshots de estado al propietario real de ese estado (originador). Así, en vez de que otros objetos intenten copiar el estado del editor desde “fuera”, la clase del editor en sí puede hacer el snapshot, pues tiene acceso completo a su propio estado.

El patrón sugiere almacenar la copia del estado del objeto en un objeto especial llamado memento (o recuerdo).

¿Cuándo usar el patrón recuerdo?

Deberías utilizar el patrón Recuerdo cuando quieras producir snapshots del estado del objeto para poder restaurar a un estado anterior. También podrías utilizar este patrón cuando el acceso directo a los campos del objeto viole su encapsulación. Que el propio objeto sea responsable de crear un snapshot de su estado.

Pros y contras del patrón recuerdo

Los siguientes son algunos de los “pros y cons” de este patrón.

Pros

Contras

  • Puedes producir snapshots del estado del objeto sin violar su encapsulación

  • Puedes simplificar el código del originador al permitir que el cuidador mantenga el historial del estado del originador

  • La aplicación puede consumir mucha RAM si los clientes crean recuerdos con mucha frecuencia

  • Los cuidadores deben rastrear el ciclo de vida del originador para destruir los recuerdos obsoletos

  • La mayoría de los lenguajes de programación dinámicos, como PHP o JavaScript, no pueden garantizar que el estado dentro del recuerdo permanezca intacto. 

“Show me the code”

Recuerdo es un patrón muy complejo y poco popular cuya aplicabilidad real es muy cuestionable en PHP, ya que la mayoría de los scripts de PHP son de un solo subproceso y tienen un tiempo de sesión muy limitado, y el estado de los objetos debe almacenarse en un almacenamiento más permanente que la RAM.

Sin embargo, si quieres tener una mejor idea de cómo se ve este patrón, puedes ver este ejemplo conceptual de refacoring.guru en PHP.

¿Utilizas el patrón Recuerdo en tus proyectos? ¿Qué tal la experiencia? ¡Coméntalo abajo!

Fuentes:

Compartir es construir