Я працюю над продуктом, у якому відповідальність одного з модулів полягає в розборі XML-файлів та скиданні необхідного вмісту в базу даних. Незважаючи на те, що ця вимога полягає лише в аналізі XML-файлів, я хочу створити свій модуль розбору таким чином, щоб я могла підтримувати будь-які файли в майбутньому. Причиною такого підходу є те, що ми будуємо цей товар для конкретного клієнта, але плануємо продати його іншим клієнтам найближчим часом. Усі системи в екосистемі для поточного клієнта виробляють і споживають XML-файли, але це може не стосуватися інших клієнтів.
Що я спробував поки що? (Сьогодні) Маю на увазі таку конструкцію, яка базується на моделі стратегії. Я швидко записав код у затемнення, щоб передати свій дизайн, тому було б чудово, якщо інші аспекти, такі як правильний спосіб поводження з винятками, поки що ігноруються.
Парсер: Інтерфейс стратегії, що розкриває метод розбору.
public interface Parser<T> {
public T parse(String inputFile);
}
* Причина використання загального параметра полягає в тому, щоб дозволити будь-який тип повернення, а також забезпечити безпеку типу під час компіляції.
ProductDataXmlParser Конкретний клас для розбору файлу product.xml, який містить інформацію про продукт. (за допомогою 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();
}
}
де : ProductDataTYPE і ProductDataDocument - це класи POMO XMlBean, створені за допомогою xsd та команди scomp.
Майбутнє
Якщо у мене в майбутньому буде розібраний файл product.txt, я можу визначити свій власний POJO під назвою ProductData, який міститиме необхідний вміст файлу. Тоді я можу створити конкретний клас під назвою ProductDataFlatFileParser, який реалізує інтерфейс Parser та метод розбору, заповнивши PODO ProductData для мене після розбору файлу.
Чи має сенс ця конструкція? Чи є явні недоліки в цій конструкції? Поки конструкція стоїть, я дозволяю конкретним класам визначати алгоритм для розбору файлу і дозволяю конкретному класу вирішувати, де розмістити дані. Дизайн, здається, більше залежить від об’єктів домену, а не від форматів файлів. Це погано? Будь-які вдячності щодо того, як я можу вдосконалити свій дизайн, будуть високо оцінені.