Pracuję nad produktem, w którym jednym z modułów jest parsowanie plików XML i zrzucanie wymaganej zawartości do bazy danych. Mimo że obecnym wymaganiem jest tylko parsowanie plików XML, chcę zaprojektować mój moduł analizujący w taki sposób, aby w przyszłości mógł obsługiwać dowolny rodzaj plików. Powodem takiego podejścia jest to, że budujemy ten produkt dla konkretnego klienta, ale planujemy sprzedać go innym klientom w najbliższej przyszłości. Wszystkie systemy w ekosystemie dla bieżącego klienta wytwarzają i zużywają pliki XML, ale może nie być tak w przypadku innych klientów.
Co do tej pory próbowałem? (Teraźniejszość) Mam na myśli następujący projekt oparty na schemacie strategii. Szybko napisałem kod w eclipse, aby przekazać mój projekt, więc byłoby wspaniale, gdyby inne aspekty, takie jak właściwy sposób obsługi wyjątków, były na razie ignorowane.
Analizator składni : interfejs strategii udostępniający metodę analizy składni.
public interface Parser<T> {
public T parse(String inputFile);
}
* Powodem użycia parametru ogólnego jest umożliwienie dowolnego typu zwrotu, a także zapewnienie bezpieczeństwa typu w czasie kompilacji.
ProductDataXmlParser Konkretna klasa do analizowania pliku product.xml, który zawiera informacje związane z produktem. (przy użyciu 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();
}
}
gdzie : ProductDataTYPE i ProductDataDocument to klasy POJO XMlBean wygenerowane za pomocą polecenia xsd i polecenia scomp.
Przyszłość
Jeśli mam plik product.txt do przeanalizowania w przyszłości, mogę zdefiniować własne POJO o nazwie ProductData, które będzie przechowywać wymaganą zawartość pliku. Następnie mogę utworzyć konkretną klasę o nazwie ProductDataFlatFileFarParser, która implementuje interfejs Parsera, a metoda parsowania wypełnia dla mnie POJO produktu ProductData po przeanalizowaniu pliku.
Czy ten projekt ma sens? Czy są jakieś oczywiste wady w tym projekcie? Na obecnym etapie pozwalam konkretnym klasom zdefiniować algorytm do parsowania pliku, a konkretna klasa decyduje, gdzie wypełnić dane. Wygląda na to, że projekt bardziej zależy od obiektów domeny niż formatów plików. Czy to źle? Wszelkie uwagi dotyczące ulepszenia mojego projektu będą bardzo mile widziane.