Sto lavorando su un prodotto in cui la responsabilità di uno dei moduli è quella di analizzare i file XML e scaricare il contenuto richiesto in un database. Anche se l'attuale requisito è solo quello di analizzare i file XML, voglio progettare il mio modulo di analisi in modo tale che possa supportare qualsiasi tipo di file in futuro. La ragione di questo approccio è che stiamo costruendo questo prodotto per un cliente specifico ma intendiamo 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.
Che cosa ho provato finora? (Il presente) Ho in mente il seguente disegno che si basa sul modello di strategia. Ho rapidamente annotato il codice in eclissi per trasmettere il mio progetto in modo che sarebbe bello se altri aspetti come il modo corretto di gestire le eccezioni sono ignorati per ora.
Parser: l'interfaccia della strategia che espone un metodo di analisi.
public interface Parser<T> {
public T parse(String inputFile);
}
* Il motivo dell'utilizzo di un parametro generico è quello di consentire qualsiasi tipo di ritorno e garantire la sicurezza del tipo in fase di compilazione.
ProductDataXmlParser Una classe concreta per l'analisi di un file product.xml che contiene informazioni correlate 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 il comando scomp.
Il futuro
Se ho un file product.txt da analizzare in futuro, posso definire il mio POJO chiamato ProductData che conserverà i contenuti richiesti del file. Posso quindi creare una classe concreta chiamata ProductDataFlatFileParser che implementa l'interfaccia Parser e avere il metodo di analisi per compilare il POJO ProductData per me dopo aver analizzato il file.
Questo progetto ha senso? Ci sono evidenti difetti in questo design? Mentre il design sta in piedi, sto permettendo alle classi concrete di definire l'algoritmo per analizzare un file e lasciare che la classe concreta decida dove popolare i dati. Il design sembra essere più dipendente dagli oggetti del dominio piuttosto che dai formati di file. è una cosa negativa? Ogni input su come posso migliorare il mio design sarà molto apprezzato.