(nota: ho usato Java per semplificare la spiegazione della mia domanda, ma il linguaggio attuale è irrilevante per questo dilemma)
TL; DR: Ho un wrapper attorno ad alcune classi sottostanti. A che punto dovrei istanziare la classe sottostante (nel costruttore, in un metodo separato, al primo utilizzo) e perché?
Diciamo, per esempio, che voglio creare una semplice classe da leggere da un file (può essere in realtà qualsiasi cosa in cui la funzionalità principale di una classe dipende da una o più classi sottostanti, ma la lettura dei file sembra più semplice da spiegare ). Questa classe traccerà / semplificherà un'altra classe chiamata File
. In passato, implementavo la mia classe di lettore di file in questo modo:
class MyFileReader {
private File file;
public MyFileReader(String filename) {
this.file = new File(filename);
}
public String read() {
this.file.read(...);
}
}
Quindi, la creazione del mio oggetto apre immediatamente il file (se esiste la possibilità che il file non esista, vorrei generare un'eccezione nel costruttore).
Al giorno d'oggi, di solito implementerei quella classe in questo modo:
class MyFileReader {
private File file;
private boolean isOpen = false;
public void open(String filename) {
if (this.isOpen) close();
this.file = new File(filename);
this.isOpen = true;
}
public void close() {
if (this.isOpen) {
this.file.close();
this.isOpen = false;
}
}
public String read() {
if (this.isOpen) {
this.file.read(...);
}
}
}
In altre parole, la creazione dell'oggetto è separata dall'apertura effettiva del file (se esiste la possibilità che il file non esista, farei in modo che il metodo open
restituisca un valore booleano che indica se la classe è riuscita ad aprire il file con successo) ed è possibile che l'oggetto esista senza file attualmente aperti.
Infine, un altro approccio che ho usato di rado è aprire il file "pigramente", quando è necessario, in questo modo:
class MyFileReader {
private File file;
private String filename;
private boolean isOpen = false;
public MyFileReader(String filename) {
this.filename = filename;
}
public String read() {
if (!this.isOpen) {
this.file = new File(filename);
this.isOpen = true;
}
this.file.read(...);
}
}
Ora la domanda è: quale di questi approcci è il migliore? E, dal momento che la risposta è probabilmente "dipende", da cosa dipende e in quali scenari è meglio applicare ciascuno di questi metodi?