8
votes

Comment est Java.io.Sérialisable le motif de Memento?

Comme nous savons que le motif de memento est sans violer l'encapsulation, capturer et extérioriser l'état interne d'un objet et peut être récupéré ultérieurement sans connaissance de l'état d'origine.

Ma question vient ici comment Java.IO.Sérialisable vient sous ce motif, car lorsque nous sommes Serializing Toute variable privée et écrivez l'état d'objet à un fichier à un fichier Au même moment, la valeur de la variable privée est ouverte au monde et l'encapsulation semble échouer ici.


7 commentaires

Article Wikipedia sur le modèle de Miment n'a aucune occurrence de encapsulation .


@Andre, veuillez vous référer ci-dessous lien. Javacamp.org/designPattern


Un autre lien pour votre référence. Sourciakaking.com/design_patterns/Memento


L'article Javacamp.org sur Memento mentionne explicitement «utilisé dans la transaction de base de données», qui est généralement équivalent à la sérialisation, comme cas d'utilisation.


Le livre Gof mentionne explicitement l'encapsulation. Il va expliquer que le souvenir devrait être "opaque" à tout le monde, mais la classe d'origine.


@ ADVS89, cela signifie-t-il qu'il ne devrait pas être utilisé pour la sérialisation, s'il est sérialisé par une classe différente (par exemple un cadre XML)?


Ce n'est pas Stackoverflow.com/questions/14076772/ ...


3 Réponses :


4
votes

le Article Wikipedia sur le modèle de Memento ne mentionne rien de l'encapsulation, dans Fait, l'exemple étant donné qu'il capture exactement l'état détenu dans une variable privée dans un souvenir.

Encapsulation ('A LANGUE LANGUE Mécanisme de limitation de la limitation de l'accès à certains des composants de l'objet') fait référence à la manière dont vous devez écrire du code dans la commande modifier l'état interne d'un objet.

L'état interne d'un objet pourrait cependant avoir été déterminé par une entrée externe telle que le contenu d'une chaîne dépend du fichier qu'il a été lu ou quelles données ont été reçues du réseau. L'état de la case à cocher dépend de la question de savoir si l'utilisateur l'a vérifié ou non alors que le champ correspondant de la classe peut avoir un accès privé et que l'État ne peut être en lecture seule pour d'autres classes.

Protéger les champs en les mettant sous un accès privé est destiné à aider le développeur à maintenir les états d'objets dans un état cohérent, c'est-à-dire éviter que les champs soient définis sur un état incohérent du code à l'extérieur de cette classe (par exemple, si la valeur du champ A dépend de la valeur du champ B ).

Cela n'a rien à voir avec la «confidentialité» en ce sens que ces données sont considérées comme secrètes . Bien sûr, on pourrait écrire une autre classe qui lit ensuite les champs privés sérialisés et les rend disponibles publiquement dans une classe différente ou que vous puissiez même éditer le fichier sérialisé, mais je ne suis pas sûr de ce que l'on gagnerait de cela.


1 commentaires

+1 à cela. L'encapsulation signifie qu'une classe n'autorise pas d'autres entités du programme d'accéder et de modifier directement les données / méthodes. Si l'encapsulation signifiait une opacité totale et non partielle, alors quelle classe qui enregistre-t-elle ses membres de données privées dans un fichier texte? Un violateur de principes d'encapsulation? En fait, cela signifierait que tous les systèmes de gestion de la base de données orientés objet violent l'encapsulation. Et cela gênerait O-O Gourous beaucoup trop :-)



0
votes

de l'article d'encapsulation de Wikipedia: dans une encapsulation de langage de programmation est utilisée se référer à l'une des deux notions associées mais distinctes, et parfois à la combinaison de ceux-ci:

  • Un mécanisme de langue pour limiter l'accès à certains des composants de l'objet.
  • une construction de langue qui facilite le regroupement de données avec les méthodes (ou d'autres fonctions) opérant sur ces données.

    de l'article d'objet opaque: Le contenu sont opaques et ne sont généralement pas interprétés tant que le destinataire passe Le cookie (ou dans notre cause, l'objet) les données retour à l'expéditeur ou peut-être un autre programme ultérieurement.

    L'encapsulation n'est pas cassée. Le motif de Memento empêche l'objet de gardien de modifier l'objet Memento, de sorte que l'expéditeur puisse le prendre pour la restauration ou d'autres utilitaires.


0 commentaires

1
votes

Ma compréhension est que le modèle de Memento ne spécifie rien sur le format / opacité / sécurité du miment / jeton lui-même. Le format du Memento (lisible à l'homme, entièrement crypté, ou n'importe où entre les deux), n'est pas pertinent pour le motif lui-même.

Je dirais que la sérialisation (XML ou Binary) est un bon exemple de mise en oeuvre de Memento. Le fait qu'il expose des internes d'objet peut signifier que ce n'est pas la meilleure mise en œuvre de votre projet. Cependant, il s'agit toujours d'une mise en œuvre valable du motif. :)


0 commentaires