Modüllerden birinin sorumluluğunun XML dosyalarını ayrıştırmak ve gerekli içeriği bir veritabanına dökmek olduğu bir ürün üzerinde çalışıyorum. Mevcut gereksinim yalnızca XML dosyalarını ayrıştırmak olsa da, ayrıştırma modülümü gelecekte her türlü dosyayı destekleyebileceğim şekilde tasarlamak istiyorum. Bu yaklaşımın nedeni, bu ürünü belirli bir müşteri için inşa etmemiz, ancak yakın gelecekte diğer müşterilere satmayı planlamamızdır. Mevcut istemci için ekosistemdeki tüm sistemler XML dosyaları üretir ve tüketir, ancak bu diğer istemciler için geçerli olmayabilir.
Şimdiye kadar ne denedim? (Günümüz) Strateji modeline dayanan şu tasarıma sahibim. Tasarımımı iletmek için tutulma kodunu hızlı bir şekilde yazdım, bu nedenle istisnaları ele alma gibi uygun yönler şimdilik göz ardı edilirse harika olurdu.
Ayrıştırıcı: Bir ayrıştırma yöntemini ortaya koyan strateji arabirimi.
public interface Parser<T> {
public T parse(String inputFile);
}
* Genel bir parametre kullanmanın nedeni, herhangi bir dönüş türüne izin vermek ve derleme zamanında tür güvenliğini sağlamaktır.
ProductDataXmlParser Ürünle ilgili bilgileri içeren bir product.xml dosyasını ayrıştırmak için somut bir sınıf. (XMLBeans kullanarak)
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();
}
}
burada : ProductDataTYPE ve ProductDataDocument, xsd ve scomp komutu kullanılarak oluşturulan XMlBean POJO sınıflarıdır.
Gelecek
Gelecekte ayrıştırılacak bir product.txt dosyası varsa, dosyanın gerekli içeriğini tutacak ProductData adlı kendi POJO'mu tanımlayabilirim. Daha sonra Parser arabirimini uygulayan ve ayrıştırma yöntemi ProductData POJO benim için dosyayı ayrıştırdıktan sonra doldurmak var ProductDataFlatFileParser adlı somut bir sınıf oluşturabilirsiniz.
Bu tasarım mantıklı mı? Bu tasarımda belirgin kusurlar var mı? Tasarım ayakta dururken, somut sınıfların bir dosyayı ayrıştırmak için algoritmayı tanımlamasına ve somut sınıfın verileri nereye dolduracağına karar vermesine izin veriyorum. Tasarım, dosya biçimlerinden ziyade etki alanı nesnelerine daha bağımlı görünmektedir. Bu kötü bir şey mi? Tasarımımı nasıl geliştirebileceğime dair herhangi bir girdi çok takdir edilecektir.