Estoy trabajando en un producto en el que la responsabilidad de uno de los módulos es analizar los archivos XML y volcar el contenido requerido en una base de datos. A pesar de que el requisito actual es solo analizar archivos XML, quiero diseñar mi módulo de análisis de manera que pueda admitir cualquier tipo de archivos en el futuro. El motivo de este enfoque es que estamos creando este producto para un cliente específico, pero planeamos venderlo a otros clientes en un futuro próximo. Todos los sistemas en el ecosistema para el cliente actual producen y consumen archivos XML, pero este puede no ser el caso para otros clientes.
¿Qué he intentado hasta ahora? (El presente) Tengo en mente el siguiente diseño que se basa en el patrón de la Estrategia. Rápidamente escribí el código en eclipse para transmitir mi diseño, por lo que sería genial si se ignoraran otros aspectos, como la forma adecuada de manejar las excepciones, por ahora.
Analizador: La interfaz de la estrategia que expone un método de análisis.
public interface Parser<T> {
public T parse(String inputFile);
}
* La razón para usar un parámetro genérico es permitir cualquier tipo de devolución, así como garantizar la seguridad del tipo en el momento de la compilación.
ProductDataXmlParser Una clase concreta para analizar un archivo product.xml que contiene información relacionada con el producto. (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();
}
}
donde : ProductDataTYPE y ProductDataDocument son clases POJO XMlBean generadas usando un xsd y el comando scomp.
El futuro
Si tengo un archivo product.txt para ser analizado en el futuro, puedo definir mi propio POJO llamado ProductData que contendrá el contenido requerido del archivo. Luego puedo crear una clase concreta llamada ProductDataFlatFileParser que implementa la interfaz del analizador y hacer que el método de análisis rellene el ProductData POJO para mí después de analizar el archivo.
¿Este diseño tiene sentido? ¿Hay defectos obvios en este diseño? Como el diseño se mantiene, estoy permitiendo que las clases concretas definan el algoritmo para analizar un archivo y dejo que la clase concreta decida dónde poblar los datos. El diseño parece depender más de los objetos del dominio que de los formatos de archivo. ¿Esto es malo? Cualquier aportación sobre cómo puedo mejorar mi diseño será muy apreciada.