La creazione di un oggetto dovrebbe implicitamente o esplicitamente creare un file?


9

Sto creando un oggetto il cui unico scopo è leggere in un file di un formato e crearne un altro di un formato diverso.

È preferibile creare il file di output in modo implicito durante l'inizializzazione dell'oggetto o disporre di un metodo pubblico che offra all'utente la scelta quando verrà creato questo file?

Risposte:


12

Se stai lavorando in una lingua che lo supporta, ti fornirò un metodo Save che utilizza uno Stream. In questo modo, l'utente può salvare i dati dove vuole.

Ci vuole 20 secondi in più per scrivere che salvare solo su un file, ma è facilmente comprensibile da un programmatore e sul sito chiamante è molto chiaro cosa accada realmente.

Il modo in cui lo hai descritto (un oggetto che legge l'input e l'output su un altro file) sembra altrimenti strano. Qual è lo scopo di costruire un oggetto che fa tutto durante la costruzione?

La chiameresti così?

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

Per qualsiasi ragionevole implementazione di SaveFileWeirdClass non mi aspetto effetti collaterali dal solo crearlo. Leggere un file - va bene. Stai creando un file? No.

A me sembra più chiaro in questo modo:

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

using(Stream stream = new FileStream(filePath))
    stuff.Save(stream);

1
Questo è buono. Un'altra opzione simile è quella di implementare un oggetto che implementa qualsiasi flusso base dell'applicazione e di trattarlo come faresti con qualsiasi altro flusso.
Steven Evers,

3

Se sei deciso a farlo in classe, crealo durante l'inizializzazione. Ritardare quel passaggio fa due cose cattive: in primo luogo, aggiunge un passaggio esplicito in più per il chiamante, che non avrebbe creato l'oggetto in primo luogo se non avessero intenzione di usarlo per produrre output. In secondo luogo, aggiunge almeno due punti in cui il codice nella classe deve decidere se il file è aperto e gestire tale condizione: una volta quando si va a scrivere l'output e una volta durante la distruzione quando si va a chiuderlo. Il primo significa che devi fare quel controllo durante ogni scrittura, il che potrebbe essere uno spreco se ne fai molti.

Personalmente, non farei nessuno dei due e opterei per fare in modo che il chiamante passi gli handle di file pre-aperti al costruttore. La creazione del file all'interno della classe impedisce di offrire ai chiamanti le opzioni per eseguire operazioni come l'impostazione delle autorizzazioni o, se si scrive su un dispositivo, l'inizializzazione specifica del dispositivo. Se vuoi avere una versione della tua FooConverterclasse che opera su file e che il grugnito della creazione funzioni, avvolgilo in a FooFileConverter.


2

In modo esplicito.

Vuoi assicurarti di non fare affidamento su regole intelligenti per gli effetti collaterali che potrebbero infrangere nelle versioni future o su architetture non comuni. Ovviamente, dovresti avere un file predefinito che l'utente può sovrascrivere se lo desidera.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.