Question

J'ai lu ce qui suit dans un article

.
  

Les objets immuables sont particulièrement   pratique pour la mise en œuvre de certaines communes   idiomes tels que annuler / rétablir et abortable   transactions. Prenez annuler par exemple. UNE   technique courante pour la mise en oeuvre de undo   est de garder une pile d'objets   en quelque sorte savoir exécuter chaque commande   à l'envers (la soi-disant "commande   Motif "). Cependant, comprendre comment   exécuter une commande en sens inverse peut être   rusé. Une technique plus simple consiste à   maintenir une pile d'objets immuables   représentant l'état du système   entre les commandes successives. Puis à   annuler une commande, il vous suffit de revenir en arrière   à l'état précédent du système (et   probablement stocker l'état actuel sur   la pile de répétition).

Cependant, l'article ne montre pas un bon exemple concret de la façon dont des objets immuables pourraient être utilisés pour implémenter "undo". opérations. Par exemple ... supprimer 10 emails d'une boîte de réception Gmail. Une fois que vous faites cela, il a une option d'annulation. Comment un objet immuable aiderait-il à cet égard?

Était-ce utile?

La solution

Les objets immuables contiendraient l’état complet du système. Dans ce cas, vous auriez l’objet A contenant la boîte de réception originale, puis l’objet B contenant la boîte de réception avec dix e-mails supprimés et ) un pointeur en arrière de B sur A indiquant que, si vous effectuez une opération "annulation", vous arrêtez d'utiliser B comme état du système et commencez à utiliser A à la place.

Cependant, les boîtes de réception Gmail sont beaucoup trop volumineuses pour utiliser cette technique. Vous l'utiliserez sur des documents pouvant être réellement stockés dans une quantité de mémoire relativement petite, afin de pouvoir en conserver un grand nombre pour les annuler à plusieurs niveaux.

Si vous souhaitez conserver dix niveaux d'annulation, vous pouvez potentiellement économiser de la mémoire en ne conservant que deux objets immuables - un objet actuel et un objet de dix "annulations". il y a - et une liste des commandes qui ont été appliquées entre eux.

Pour effectuer une "annulation", vous ré-exécutez tous les objets sauf le dernier objet Command, vous les utilisez comme nouvel objet actuel et vous effacez la dernière commande (ou vous l'enregistrez sous la forme d'un objet "Rétablir"). Chaque fois que vous effectuez une nouvelle action, vous mettez à jour l'objet actuel, ajoutez la commande associée à la liste, puis (si la liste compte plus de dix commandes), vous exécutez la première commande sur l'objet à partir du début de la liste d'annulation. et jeter la première commande de la liste.

Vous pouvez également utiliser divers autres systèmes de point de contrôle, impliquant un nombre variable de représentations complètes du système ainsi qu'un nombre variable de commandes entre eux. Mais cela va de plus en plus loin de l’idée originale que vous avez citée et ressemble de plus en plus à un système mutable typique. Cela évite toutefois le problème de rendre les commandements systématiquement réversibles; vous devez uniquement appliquer les commandes à un objet en avant et non en arrière.

SVN et les autres systèmes de contrôle de version sont en réalité une forme d'annulation / restauration basée sur le disque ou le réseau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top