Estou trabalhando em um produto no qual a responsabilidade de um dos módulos é analisar arquivos XML e despejar o conteúdo necessário em um banco de dados. Mesmo que o requisito atual seja apenas analisar arquivos XML, desejo projetar meu módulo de análise de forma que possa suportar qualquer tipo de arquivo no futuro. O motivo dessa abordagem é que estamos construindo este produto para um cliente específico, mas planejamos vendê-lo para outros clientes em um futuro próximo. Todos os sistemas no ecossistema para o cliente atual produzem e consomem arquivos XML, mas isso pode não ser o caso para outros clientes.
O que eu tentei até agora? (O presente) Tenho em mente o seguinte design, baseado no padrão de estratégia. Eu rapidamente escrevi o código no eclipse para transmitir meu design, então seria ótimo se outros aspectos, como a maneira correta de lidar com exceções, fossem ignorados por enquanto.
Analisador: a interface da estratégia que expõe um método de análise.
public interface Parser<T> {
public T parse(String inputFile);
}
* O motivo do uso de um parâmetro genérico é permitir qualquer tipo de retorno e garantir a segurança do tipo no momento da compilação.
ProductDataXmlParser Uma classe concreta para analisar um arquivo product.xml que contém informações relacionadas ao produto. (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();
}
}
em que : ProductDataTYPE e ProductDataDocument são classes XMlBean POJO geradas usando um xsd e o comando scomp.
O futuro
Se eu tiver um arquivo product.txt a ser analisado no futuro, posso definir meu próprio POJO chamado ProductData que conterá o conteúdo necessário do arquivo. Em seguida, posso criar uma classe concreta chamada ProductDataFlatFileParser que implementa a interface Parser e fazer com que o método de análise preencha o POJO ProductData para mim depois de analisar o arquivo.
Esse design faz sentido? Existem falhas óbvias nesse design? Como está o design, estou permitindo que as classes concretas definam o algoritmo para analisar um arquivo e deixe a classe concreta decidir onde preencher os dados. O design parece ser mais dependente dos objetos do domínio do que dos formatos de arquivo. Isso é ruim? Quaisquer contribuições sobre como melhorar meu design serão muito apreciadas.