Philosophie derrière le modèle memento

9

J'ai lu sur le modèle de souvenir de diverses sources sur Internet. Des informations différentes provenant de différentes sources m'ont laissé dans la confusion quant à la raison pour laquelle ce modèle est réellement nécessaire.

La mise en œuvre dofactory indique que l'intention principale de ce modèle est de restaurer l'état du système.

Le wiki indique que l'intention principale est de pouvoir restaurer les modifications sur le système. Cela donne un impact différent - en disant qu'il est possible pour un système d'avoir une implémentation de memento sans avoir besoin de restaurer. Et cette capacité de restauration en est une caractéristique.

OODesign dit que

Il est parfois nécessaire de capturer l'état interne d'un objet à un moment donné et de pouvoir restaurer l'objet à cet état plus tard dans le temps. Un tel cas est utile en cas d'erreur ou d'échec.

Donc, ma question est pourquoi utilisons-nous exactement celui-ci? Est-ce pour sauver les états précédents - ou pour favoriser l'encapsulation entre le gardien et le souvenir? Pourquoi ce type d'encapsulation est-il si important?

Edit: Pour ceux qui visitent, consultez cette mise en œuvre!

Edit : Je travaille à l'implémentation d'une solution de memento à mon problème. Je posterai une autre question à ce sujet et lierai cette question à celle-ci. Merci à tous d'avoir répondu avec de précieuses suggestions!

Edit 3 : Voici le lien vers mon exemple d'implémentation

TheSilverBullet
la source

Réponses:

2

Un modèle similaire, Mémo ou Mémorisation, stocke également l'état, mais il est souvent utilisé comme optimisation de la vitesse du programme. Si une opération longue prend un nombre limité d'entrées et de sorties communes, les plus courantes (ou toutes) peuvent être stockées dans une table de hachage. Lorsqu'il est rappelé avec les mêmes entrées, il vérifie d'abord la table de hachage et s'il les trouve, il renvoie la sortie précédente sans la recalculer.

J'imagine qu'un modèle Memento pourrait également être utilisé pour les performances - au lieu de faire tous les calculs inverses pour un changement d'état inverse, restaurez simplement à partir de l'état précédent. Certaines fonctions sont à sens unique, il n'y a donc pas d'annulation à moins que vous ne stockiez l'état précédent.

Vous pouvez utiliser un modèle Memento pour mémoriser une fonction périodique ou symétrique comme le sinus. Calculez toutes les valeurs de 0 à 180 degrés, puis revenez en arrière pour obtenir les valeurs négatives de 180 à 360. Mieux encore, calculez les valeurs de 0 à 90, puis revenez en arrière à travers ces valeurs pour obtenir 90 à 180, en avant pour 180 à 270 et en arrière de 270 à 360.

Ctrl-Z dans Word, ou la fonction d'annulation de tout logiciel est probablement implémentée en utilisant le modèle de mémento, ou dans certains cas, éventuellement par une inversion de la fonction qui a apporté chaque modification. Dans le second cas, l'historique des fonctions appelées serait des souvenirs, donc je suppose que le modèle de souvenir est toujours utilisé pour l'annulation.

GlenPeterson
la source
modèle de mémorisation utilisé pour éviter le calcul inverse et pour les fonctions périodiques - merci pour cette info! Rien de tel qu'un exemple pratique pour faire pénétrer les concepts!
TheSilverBullet
Il peut également être utilisé avec quelque chose comme la méthode de Newton pour l'approximation de la racine carrée pour décider quand vous avez terminé. mitpress.mit.edu/sicp/full-text/book/… Étant donné que la représentation sous-jacente à virgule flottante a une précision limitée, tous les nombres auront éventuellement des approximations répétitives. Si vous savez quelles étaient les anciennes approximations, vous pouvez arrêter d'approximer la première fois que vous répétez une réponse et obtenir une précision maximale (au détriment du temps et de la mémoire).
GlenPeterson
8

En soi, le modèle Memento est juste utilisé pour capturer et enregistrer des états. L'encapsulation n'existe que pour protéger les états du reste du système - une fois qu'un état est capturé, il doit être contrôlé avec soin. Par exemple, cela n'a pas de sens de pouvoir changer un état précédent une fois qu'il a été enregistré (ce serait changer l'historique) et il pourrait ne pas être logique de simplement revenir à un état précédent d'un objet sans affecter les autres (pour éviter le système d'entrer dans un état entièrement invalide).

L'utilisation la plus courante d'un Memento que j'ai vu est de prendre en charge la fonctionnalité d'annulation. Il est également lié au stockage de la fonctionnalité de rétablissement en reculant dans le temps.

Thomas Owens
la source
Je l'ai également utilisé dans la logique de copie et la logique de sérialisation (pour envoyer des objets sur un fil ou enregistrer l'état dans un fichier).
Scott Whitlock
@ScottWhitlock L'enregistrement de l'état dans un fichier est logique pour Memento. L'objet Memento aurait la possibilité de s'écrire dans un format spécifié et d'en créer un nouveau en lisant ce format, tandis que le concierge fournirait l'interface pour enregistrer l'état dans un format externe ou charger l'état à partir du format externe - ce n'est qu'une extension pour enregistrer l'état en mémoire. Je ne peux pas vraiment voir son utilisation dans la logique de copie, cependant. Je devrais y penser beaucoup plus.
Thomas Owens
@ThomasOwens, merci pour cette partie importante de votre explication selon laquelle le souvenir est essentiellement de "sauver" les états. Il est à la discrétion de l'implémentateur de restaurer ou non! J'ai trouvé cette partie de l'explication manquante dans toutes mes références !!
TheSilverBullet
@ScottWhitlock, merci beaucoup pour le lien vers votre implémentation de souvenir! J'ai pu comprendre non seulement son utilisation de base, mais aussi son utilisation intuitive comme vous l'avez fait!
TheSilverBullet
1

Toutes ces définitions vous orientent dans la même direction; ils disent tous qu'il s'agit de pouvoir restaurer quelque chose à son état antérieur. Ce quelque chose peut être le système entier, ou juste un seul objet.

Ce modèle est utile si un enregistrement change d'état au fil du temps, mais que vous avez besoin de pouvoir le restaurer à tout état précédent à tout moment. Ou bien, si vous devez être en mesure d'afficher l'enregistrement tel qu'il était à tout moment antérieur. Ces types d'exigences sont très courants dans de nombreux types de systèmes.

hvgotcodes
la source