Filosofía detrás del patrón de recuerdo

9

He estado leyendo sobre el patrón de recuerdo de varias fuentes de Internet. La información diferente de diferentes fuentes me ha dejado confundido sobre por qué este patrón es realmente necesario.

La implementación dofactory dice que la intención principal de este patrón es restaurar el estado del sistema.

Wiki dice que la intención principal es poder restaurar los cambios en el sistema. Esto tiene un impacto diferente: decir que es posible que un sistema tenga una implementación de memoria sin necesidad de restaurar. Y esa capacidad de restauración es una característica de esto.

OODesign dice que

A veces es necesario capturar el estado interno de un objeto en algún momento y tener la capacidad de restaurar el objeto a ese estado más adelante en el tiempo. Tal caso es útil en caso de error o falla.

Entonces, mi pregunta es ¿por qué exactamente usamos este? ¿Es para salvar estados anteriores o para promover la encapsulación entre el Guardián y el Recuerdo? ¿Por qué es este tipo de encapsulación tan importante?

Editar: Para aquellos que visiten, ¡revisen esta Implementación!

Editar : estoy trabajando en la implementación de una solución de recuerdo a mi problema. Publicaré otra pregunta al respecto y vincularé esa pregunta a esta. ¡Gracias a todos por responder con valiosas sugerencias!

Edición 3 : Aquí está el enlace a mi implementación de muestra

TheSilverBullet
fuente

Respuestas:

2

Un patrón similar, Memo o Memoization, también almacena el estado, pero a menudo se usa como una optimización de velocidad de programa. Si una operación que consume mucho tiempo tiene un número limitado de entradas y salidas comunes, las más comunes (o todas ellas) se pueden almacenar en una tabla hash. Cuando se vuelve a llamar con las mismas entradas, primero verifica la tabla hash y, si las encuentra, devuelve la salida anterior sin volver a calcularla.

Me imagino que también se podría usar un patrón Memento para el rendimiento: en lugar de hacer todos los cálculos inversos para un cambio de estado inverso, solo restaure desde el estado anterior. Algunas funciones son unidireccionales, por lo que no hay deshacer a menos que almacene el estado anterior.

Puede usar un patrón Memento para memorizar una función periódica o simétrica como seno. Calcule todos los valores de 0-180 grados, luego vaya hacia atrás para obtener los valores negativos de 180-360. Mejor aún, calcule valores de 0-90, luego retroceda esos valores para obtener 90-180, avance de 180-270 y retroceda de 270-360.

Ctrl-Z en Word, o la función de deshacer de cualquier software, probablemente se implementa utilizando el patrón de recuerdo, o en algunos casos, posiblemente por un reverso de la función que realizó cada cambio. En el segundo caso, la historia de las funciones que se llamaron sería recuerdos, por lo que supongo que el patrón de recuerdo siempre se usa para deshacer.

GlenPeterson
fuente
patrón de memorización utilizado para evitar el cálculo inverso y para funciones periódicas, ¡gracias por esta información! ¡Nada como un ejemplo práctico para que los conceptos se filtren!
TheSilverBullet
También se puede usar con algo como el método de Newton para la aproximación de raíz cuadrada para decidir cuándo ha terminado. mitpress.mit.edu/sicp/full-text/book/… Dado que la representación de punto flotante subyacente tiene una precisión limitada, todos los números eventualmente tendrán aproximaciones repetidas. Si sabe cuáles eran las aproximaciones anteriores, puede dejar de aproximarse la primera vez que repite una respuesta y obtener la máxima precisión (a expensas de algo de tiempo y memoria).
GlenPeterson
8

Por sí mismo, el patrón de recuerdo solo se usa para capturar y guardar estados. La encapsulación existe solo para proteger los estados del resto del sistema; una vez que se captura un estado, debe controlarse cuidadosamente. Por ejemplo, no tiene sentido poder cambiar un estado anterior una vez que se ha guardado (eso sería cambiar el historial) y podría no tener sentido simplemente regresar a un estado anterior de un objeto sin afectar a otros (para evitar el sistema de entrar en un estado completamente inválido).

El uso más común de un Memento que he visto es para admitir la funcionalidad de deshacer. También está relacionado con el almacenamiento de la funcionalidad de rehacer retrocediendo en el tiempo.

Thomas Owens
fuente
También lo he usado en lógica de copia y lógica de serialización (para enviar objetos a través de un cable o guardar el estado en un archivo).
Scott Whitlock
@ScottWhitlock Guardar estado en un archivo tiene sentido para Memento. El objeto Memento podría escribirse en un formato específico y crear uno nuevo leyendo este formato, mientras que el Caretaker proporcionaría la interfaz para guardar el estado en un formato externo o cargar el estado desde el formato externo: es solo una extensión para guardar el estado en la memoria. Sin embargo, realmente no puedo ver su uso en la lógica de copia. Tendría que pensarlo mucho más.
Thomas Owens
@ThomasOwens, gracias por esa parte importante en su explicación de que el recuerdo es básicamente "salvar" estados. ¡Es la discreción del implementador restaurar o no! ¡Encontré esta parte de la explicación que falta en todas mis referencias!
TheSilverBullet
@ScottWhitlock, ¡muchas gracias por el enlace a su implementación de recuerdo! ¡Pude entender no solo su uso básico, sino también el uso intuitivo como lo has hecho!
TheSilverBullet
1

Todas estas definiciones lo conducen en la misma dirección; Todos dicen que el punto es poder restaurar algo a su estado anterior. Ese algo puede ser todo el sistema, o solo un solo objeto.

Este patrón es útil si un registro cambia de estado con el tiempo, pero tiene el requisito empresarial de poder restaurarlo a cualquier estado anterior en cualquier momento. O, alternativamente, si necesita poder ver el registro como estaba en cualquier momento anterior. Estos tipos de requisitos son muy comunes en muchos tipos de sistemas.

hvgotcodes
fuente