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

9

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

È meglio creare implicitamente il file di output durante l'inizializzazione dell'oggetto o disporre di un metodo pubblico che offre all'utente la scelta quando verrà creato questo file?

    
posta PDStat 24.10.2011 - 12:07
fonte

4 risposte

12

Se lavori in una lingua che lo supporta, fornirei un metodo di salvataggio che utilizza un flusso. In questo modo, l'utente può salvare i dati ovunque desideri.

Il tempo di scrittura è più lungo di 20 secondi rispetto al salvataggio in un file, ma è facilmente comprensibile da un programmatore e sul sito di chiamata è molto chiaro ciò che accade realmente.

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

La chiameresti in questo modo?

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

Per qualsiasi ragionevole implementazione di SaveFileWeirdClass non mi aspetterei effetti collaterali dalla sua creazione. Leggere un file - bene. Creare un file? No.

Per 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);
    
risposta data 24.10.2011 - 13:56
fonte
3

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

Personalmente, non farei nessuna delle due opzioni e opero per far sì che il chiamante passi gli handle di file pre-aperti al costruttore. La creazione del file all'interno della classe preclude ai chiamanti le opzioni per fare cose come l'impostazione delle autorizzazioni o, se si scrive su un dispositivo, l'inizializzazione specifica del dispositivo. Se vuoi avere una versione della tua classe FooConverter che opera sui file e fa funzionare il grunt della creazione, avvolgila in FooFileConverter .

    
risposta data 24.10.2011 - 13:09
fonte
2

in modo esplicito.

Desiderate assicurarvi di non fare affidamento su regole di effetto collaterale intelligenti che potrebbero interferire con le versioni future o con architetture non comuni. Ovviamente, dovresti avere un file predefinito che l'utente può sovrascrivere nel caso in cui scelga di farlo.

    
risposta data 24.10.2011 - 12:21
fonte
1

Oltre agli altri argomenti per un metodo esplicito: se si esegue il lavoro nel costruttore, si impone a tutti gli utenti della classe di eseguire la gestione delle eccezioni solo per la creazione dell'oggetto. Questo può portare a un sacco di codice standard.

Vedi link per una discussione intorno a questo.

    
risposta data 06.04.2016 - 07:56
fonte

Leggi altre domande sui tag