La création d'un objet doit-elle implicitement ou explicitement créer un fichier?

9

Je crée un objet dont le seul but est de lire dans un fichier d'un format et d'en créer un autre d'un format différent.

Est-il préférable de créer le fichier de sortie implicitement lors de l'initialisation de l'objet ou d'avoir une méthode publique qui donne à l'utilisateur le choix du moment où ce fichier sera créé?

PDStat
la source

Réponses:

12

Si vous travaillez dans une langue qui le prend en charge, je fournirais une méthode Save qui prend un flux. De cette façon, l'utilisateur peut enregistrer les données où il le souhaite.

L'écriture prend 20 secondes de plus que l'enregistrement uniquement dans un fichier, mais elle est facilement comprise par un programmeur, et sur le site appelant, il est très clair ce qui se passe réellement.

La façon dont vous l'avez décrit (un objet qui lit les entrées et les renvoie dans un autre fichier) semble autrement étrange. Quel est le but de construire un objet qui fait tout pendant la construction?

Pourriez-vous l'appeler ainsi?

var stuff = DoStuff();
new SaveFileWeirdClass(stuff);
return;

Pour toute implémentation raisonnable de SaveFileWeirdClass, je ne m'attendrais à aucun effet secondaire en le créant simplement. Lire un fichier - très bien. Vous créez un fichier? Non.

Cela me semble plus clair de cette façon:

var stuff = new StuffReader(); //Better name needed...
string filePath = this.whatever;

using(Stream stream = new FileStream(filePath))
    stuff.Save(stream);
Max
la source
1
C'est bon. Une autre option similaire consiste à simplement implémenter un objet qui implémente la base de flux de l'application et à la traiter comme vous le feriez pour tout autre flux.
Steven Evers
3

Si vous êtes déterminé à le faire en classe, créez-le lors de l'initialisation. Retarder cette étape fait deux mauvaises choses: Premièrement, il ajoute une étape supplémentaire explicite pour l'appelant, qui n'aurait pas créé l'objet en premier lieu à moins qu'il n'ait eu l'intention de l'utiliser pour produire une sortie. Deuxièmement, il ajoute au moins deux points où le code de la classe doit décider si le fichier est ouvert et gérer cette condition: une fois lorsque vous allez écrire la sortie et une fois pendant la destruction lorsque vous allez la fermer. Le premier signifie que vous devez effectuer cette vérification à chaque écriture, ce qui pourrait être un gaspillage si vous en faites beaucoup.

Personnellement, je ne ferais ni l'un ni l'autre et opterais pour que l'appelant passe des poignées de fichier pré-ouvertes au constructeur. La création du fichier à l'intérieur de la classe empêche de donner aux appelants les options pour faire des choses comme définir des autorisations ou, si vous écrivez sur un périphérique, effectuer une initialisation spécifique au périphérique. Si vous voulez avoir une version de votre FooConverterclasse qui fonctionne sur des fichiers et qui fait le travail de création, enveloppez-la dans un fichier FooFileConverter.

Blrfl
la source
2

Explicitement.

Vous voulez vous assurer que vous ne comptez pas sur des règles d'effets secondaires intelligentes qui pourraient soit casser dans les futures versions, soit sur des architectures peu communes. Bien sûr, vous devez avoir un fichier par défaut que l'utilisateur peut remplacer s'il le souhaite.

Sardathrion - contre les abus SE
la source
1

En plus des autres arguments pour une méthode explicite: Si vous effectuez le travail dans le constructeur, vous forcez chaque utilisateur de votre classe à gérer les exceptions juste pour créer l'objet. Cela peut conduire à beaucoup de code passe-partout.

Voir /programming/6086334/is-it-good-practice-to-make-the-constructor-throw-an-exception pour une discussion à ce sujet.

Bananeweizen
la source