47 votes

Les objets écrire lui-même à un fichier, ou si un autre objet agir sur elle pour effectuer des e/S?

NOTE: Désolé pour la longue question!

J'essaie de comprendre certains domaines clés, derrière l'orientation de l'objet et je n'arrivais pas à décider d'une manière ou d'une autre à propos de ma question.

Disons que j'ai un objet plein de jolies données. La classe de bob.

Bob myBob = new Bob("This string is data");

Disons que je veux sauvegarder le contenu de myBob à un fichier xml (bob.xml)

Dois-je avoir un objet loi sur bob pour écrire le contenu, ou devrais-je myBob faire cela?

Cas 1: Agir sur l'objet

Writer myWriter = new Writer(myBob, "C:\\bob.xml");

Cas 2: méthode Save

myBob.Save("C:\\bob.xml");

Certaines personnes sont parti avec la première option car cela signifie que si le code d'écriture de fichier est modifié, il n'a pas besoin de mise à jour dans chaque méthode d'enregistrement; la promotion de la réutilisation de code, je suppose. Mon problème, c'est l'obtention de toutes les données des objets qui peuvent avoir des données privées sans accesseur.

Le cas pour l'option deux est que la méthode n'agit que sur les données détenues par l'objet et c'est la façon dont il devrait être. Pas d'interférences avec d'autres objets.

Ou est la réponse à ma question un de ces cas "dépendant" des questions? Si oui, comment savez-vous quand une méthode est privilégiée plutôt que l'autre?

37voto

Greg D Points 24218

L'approche correcte, en général, est votre Cas 1. Cela maintient une seule et unique responsabilité de la classe (ce qu'il fait) sans couplage à un mécanisme de persistance (un disque).

Vous êtes à la recherche à un cas particulier de plus généralisée problème: la Sérialisation. C'est bon et OK pour un objet d'avoir des moyens pour indiquer la façon dont il devrait être sérialisé-- c'est la seule entité qui sait ce qui est nécessaire pour désérialiser, après tout. Mais si vous faites l'objet d'enregistrer lui-même sur le disque, vous avez étroitement couplé l'objet d'une mise en œuvre spécifique.

Au lieu de cela, envisager de créer une interface qui généralisée "écrivain" peuvent utiliser pour "sérialiser" l'objet de tout ce que l'écrivain sérialise pour. De cette façon, vous serez en mesure de sérialiser sur le disque, au réseau, à la mémoire, à tout ce que vous avez réellement besoin de sérialiser pour. :)

25voto

Colin Burnett Points 4572

Je ferais Bob savoir comment sérialiser lui-même puisqu'il a données privées. Un autre objet (comme votre Writer) permettrait de prendre et de le mettre sur le disque. Bob sait comment traiter ses données mieux, mais il ne se préoccupe pas de savoir comment et où est stocké. Votre Écrivain sait comment faire pour enregistrer des données de meilleure, mais elle n'a pas besoin de soins au sujet de la façon dont les données est créé.

9voto

Trevor Points 863

C'est un exemple de cas où la Conception de la Stratégie Modèle pourrait être utilisé. Vous myBob objet pourrait avoir une instance de la classe qui va l'écrire. Vous souhaitez peut-être l'écrivain de mettre en œuvre et de l'interface ou de dériver d'une classe abstraite, de sorte que la sauvegarde de routine peut être facilement changé. Aujourd'hui, vous enregistrez le fichier xml, mais vous pourriez avoir besoin pour éventuellement persister l'objet d'une base de données. Ce modèle vous permettra de changer l'enregistrer routine facilement. Vous avez même la possibilité de changer le mode d'enregistrement lors de l'exécution.

3voto

JoshBerke Points 34238

Je préfère l'option 2; cependant, comme j'ai commencé à vraiment essayer de comprendre et de modéliser les domaines que je travaille, je préfère l'option 1.

Imaginez si votre modélisation des Véhicules. Pourquoi un véhicule de savoir comment persister lui-même? Il pourrait savoir comment se déplacer, comment commencer et comment l'arrêter, mais ce qui est Enregistrer dans le contexte d'un véhicule.

3voto

djcouchycouch Points 5647

Une autre méthode consiste à utiliser le modèle visiteur. Votre objet de contenir un Accepter méthode qui passe par les membres que vous souhaitez traiter/sérialiser, et avoir un visiteur être votre sérialiseur. Chaque fois que vous mettez à jour ou de modifier votre sérialisation (texte brut au format xml binaire à quoi que ce soit), vous n'avez pas besoin de mise à jour de l'objet.

Nous avons eu de bonnes expériences au travail font de cette façon. C'est assez puissant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X