Sto lavorando a un prodotto in cui la responsabilità di uno dei moduli è analizzare i file XML e scaricare il contenuto richiesto in un database. Anche se il presente requisito è solo di analizzare i file XML, voglio progettare il mio modulo di analisi in modo da poter supportare qualsiasi tipo di file in futuro. La ragione di questo approccio è che stiamo costruendo questo prodotto per un cliente specifico ma prevediamo di venderlo ad altri clienti nel prossimo futuro. Tutti i sistemi nell'ecosistema per il client corrente producono e consumano file XML ma questo potrebbe non essere il caso per altri client.
Cosa ho provato finora? (Il presente) Ho in mente il seguente disegno basato sul modello di strategia. Ho rapidamente scritto il codice in eclipse per trasmettere il mio design, quindi sarebbe fantastico se per il momento ignorassimo altri aspetti come il modo corretto di gestire le eccezioni.
Parser: l'interfaccia strategica che espone un metodo di analisi.
public interface Parser<T> {
public T parse(String inputFile);
}
* Il motivo dell'utilizzo di un parametro generico è consentire qualsiasi tipo di ritorno e garantire la sicurezza del tipo al momento della compilazione.
ProductDataXmlParser Una classe concreta per l'analisi di un file product.xml che contiene informazioni relative al prodotto. (usando XMLBeans)
public class ProductDataXmlParser implements Parser<ProductDataTYPE> {
public ProductDataTYPE parse(String inputFile) {
ProductDataTYPE productDataDoc = null;
File inputXMLFile = new File(inputFile);
try {
productDataDoc = ProductDataDocument.Factory.parse(inputXMLFile);
} catch(XmlException e) {
System.out.println("XmlException while parsing file : "+inputXMLFile);
} catch(IOException e) {
System.out.println("IOException while parsing file : "+inputXMLFile);
}
return productDataDoc.getProductData();
}
}
dove : ProductDataTYPE e ProductDataDocument sono classi POJO XMlBean generate utilizzando un comando xsd e scomp.
Il futuro
Se avrò un file product.txt da analizzare in futuro, posso definire il mio POJO chiamato ProductData che conterrà i contenuti richiesti del file. Posso quindi creare una classe concreta denominata ProductDataFlatFileParser che implementa l'interfaccia del parser e che il metodo di analisi compili il POJO ProductData per me dopo aver analizzato il file.
Questo design ha senso? Ci sono difetti evidenti in questo design? Allo stato attuale del progetto, sto permettendo alle classi concrete di definire l'algoritmo per analizzare un file e lasciando che la classe concreta decida dove popolare i dati. Il design sembra essere più dipendente dagli oggetti di dominio piuttosto che dai formati di file. è una cosa negativa? Qualsiasi input su come posso migliorare il mio design sarà molto apprezzato.