mercoledì 21 ottobre 2015

Java - scrivere oggetti diversi su file

Il problema e' questo: si tratta di generare dei file con dei dati (non importa sapere quali) da inviare ad un determinato Ente. Questo Ente vuole un formato particolare e a seconda del tipo di file da generare o sono diversi gli oggetti dai quali si prendono i dati o e' diversa la disposizione dei campi o entrambe le cose.

Una soluzione potrebbe essere quella di avere una classe che scrive i file per ogni occasione da generare. Ma non mi piaceva, tanto codice da scrivere, poco riutilizzabile, poco pratico e poco elegante.

Ecco allora la mia soluzione (non escludo che ce ne possano essere di migliori): due classi, una astratta e una che scrive fisicamente il file. La classe che scrive il file se ne frega altamente di tutto. Lei scrive una riga su file e basta. Ha un metodo statico che prende come parametri un'istanza concreta della classe astratta (e li' e' il trucco) e il file da scrivere. Questa classe astratta ha un metodo (astratto anch'esso) getRows() che non fa altro che restituire una lista di stringhe (che sono le righe da scrivere sul file). Sara' poi l'implementazione concreta della classe astratta che dira' come effettivamente queste righe devono essere fatte. Ovviamente bisognera' avere un'implementazione concreta per ogni tipo di file.

La classe template

La classe (astratta) Template: ha un metodo astratto getRows che restituisce la lista di righe come dev'essere scritta su file. Ovviamente e' astratto perche' sta a chi la implementa definire come la singola riga dev'essere fatta. Ha inoltre un metodo getEndLine per definire il carattere di fine riga (anche questo puo' cambiare a seconda delle specifiche)

La classe file writer

La classe file Writer: ha un solo metodo statico che scrive il file. Il file me lo faccio passare come parametro (insieme al Template) e lo restituisco "riempito". Potrei anche restituire un nuovo file e farmi passare il nome o crearne uno temporaneo. Per questioni di come e' implementato il contesto mi tornava piu' comodo cosi'. Il "barbatrucco" e' delegare all'implementazione della classe template come le righe del file devono essere fatte. Al filewriter non interessa, prende una riga per volta, la scrive e chiude lo stream.

Il momento della scrittura sara' uguale per tutti (lo fa sempre file writer). Basta implementare i vari template secondo le specifiche che verrranno fornite dall'ente ed e' a posto. Anche qualora queste specifiche cambiassero, o se si deve generare dei tipi di file nuovi, basta cambiare o implementare nuovi template...

Alla prossima!

Nessun commento:

Posta un commento

I messaggi non appaiono subito ma a seguito dell'approvazione di un moderatore. Siete pregati di seguire le seguenti regole