Ich arbeite an einem Produkt, für das eines der Module die Aufgabe hat, XML-Dateien zu analysieren und den erforderlichen Inhalt in einer Datenbank abzulegen. Obwohl die gegenwärtige Anforderung nur darin besteht, XML-Dateien zu analysieren, möchte ich mein Parsing-Modul so gestalten, dass ich in Zukunft alle Arten von Dateien unterstützen kann. Der Grund für diesen Ansatz ist, dass wir dieses Produkt für einen bestimmten Kunden entwickeln, es aber in naher Zukunft an andere Kunden verkaufen möchten. Alle Systeme im Ökosystem für den aktuellen Client produzieren und konsumieren XML-Dateien. Dies ist jedoch möglicherweise bei anderen Clients nicht der Fall.
Was habe ich bisher versucht? (Die Gegenwart) Ich habe das folgende Design im Auge, das auf dem Strategiemuster basiert. Ich habe den Code in Eclipse schnell aufgeschrieben, um mein Design zu vermitteln. Daher wäre es großartig, wenn andere Aspekte wie die richtige Behandlung von Ausnahmen vorerst ignoriert würden.
Parser: Die Strategieschnittstelle, die eine Analysemethode verfügbar macht.
public interface Parser<T> {
public T parse(String inputFile);
}
* Der Grund für die Verwendung eines generischen Parameters besteht darin, jeden Rückgabetyp zuzulassen und die Typensicherheit bei der Kompilierung zu gewährleisten.
ProductDataXmlParser Eine konkrete Klasse zum Parsen einer product.xml-Datei, die produktbezogene Informationen enthält. (mit 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();
}
}
Dabei gilt Folgendes: ProductDataTYPE und ProductDataDocument sind XMlBean-POJO-Klassen, die mit xsd und dem Befehl scomp generiert wurden.
Die Zukunft
Wenn ich eine product.txt-Datei habe, die in Zukunft analysiert werden soll, kann ich mein eigenes POJO mit dem Namen ProductData definieren, das den erforderlichen Inhalt der Datei enthält. Ich kann dann eine konkrete Klasse mit dem Namen ProductDataFlatFileParser erstellen, die die Parser-Schnittstelle implementiert, und die Analysemethode das POJO ProductData für mich füllen lassen, nachdem die Datei analysiert wurde.
Ist dieser Entwurf sinnvoll? Gibt es offensichtliche Mängel in diesem Design? Nach dem derzeitigen Stand des Designs gestatte ich den konkreten Klassen, den Algorithmus zum Parsen einer Datei zu definieren und der konkreten Klasse zu überlassen, wo die Daten gefüllt werden sollen. Das Design scheint eher von den Domänenobjekten als von den Dateiformaten abhängig zu sein. Ist das eine schlechte Sache? Alle Beiträge zur Verbesserung meines Designs werden sehr geschätzt.