Saya sedang mengerjakan suatu produk di mana tanggung jawab salah satu modul adalah mem-parsing file XML dan membuang konten yang diperlukan dalam database. Meskipun persyaratan saat ini hanya untuk mem-parsing file XML, saya ingin merancang modul parsing saya dengan cara yang saya dapat mendukung semua jenis file di masa depan. Alasan untuk pendekatan ini adalah bahwa kami sedang membangun produk ini untuk klien tertentu tetapi berencana untuk menjualnya ke klien lain dalam waktu dekat. Semua sistem dalam ekosistem untuk klien saat ini menghasilkan dan menggunakan file XML tetapi ini mungkin tidak berlaku untuk klien lain.
Apa yang sudah saya coba sejauh ini? (Hadiah) Saya memiliki desain berikut dalam pikiran yang didasarkan pada pola Strategi. Saya telah dengan cepat menuliskan kode dalam gerhana untuk menyampaikan desain saya sehingga akan lebih bagus jika aspek-aspek lain seperti cara penanganan pengecualian yang tepat diabaikan untuk saat ini.
Parser: Antarmuka strategi yang memperlihatkan metode parse.
public interface Parser<T> {
public T parse(String inputFile);
}
* Alasan untuk menggunakan parameter generik adalah untuk memungkinkan semua jenis pengembalian serta memastikan keamanan jenis pada waktu kompilasi.
ProductDataXmlParser Kelas konkret untuk mem-parsing file product.xml yang berisi informasi terkait produk. (menggunakan 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();
}
}
di mana : ProductDataTYPE dan ProductDataDocument adalah kelas XMlBean POJO yang dihasilkan menggunakan xsd dan perintah scomp.
Masa depan
Jika saya memiliki file product.txt untuk diuraikan di masa mendatang, saya dapat menentukan POJO saya sendiri yang disebut ProductData yang akan menampung konten yang diperlukan dari file tersebut. Saya kemudian dapat membuat kelas konkret yang disebut ProductDataFlatFileParser yang mengimplementasikan antarmuka Parser dan meminta metode parse mengisi POJO ProductData untuk saya setelah mem-parsing file.
Apakah desain ini masuk akal? Apakah ada kekurangan yang jelas dalam desain ini? Sebagai desain berdiri, saya membiarkan kelas beton untuk mendefinisikan algoritma untuk mem-parsing file dan membiarkan kelas beton memutuskan di mana mengisi data. Desain tampaknya lebih bergantung pada objek domain daripada format file. Apakah ini hal yang buruk? Setiap masukan tentang bagaimana saya dapat meningkatkan desain saya akan sangat dihargai.