Tôi đang làm việc trên một sản phẩm trong đó trách nhiệm của một trong các mô-đun là phân tích các tệp XML và kết xuất nội dung cần thiết trong cơ sở dữ liệu. Mặc dù yêu cầu hiện tại chỉ là phân tích các tệp XML, tôi muốn thiết kế mô-đun phân tích cú pháp của mình theo cách mà tôi có thể hỗ trợ bất kỳ loại tệp nào trong tương lai. Lý do cho cách tiếp cận này là chúng tôi đang xây dựng sản phẩm này cho một khách hàng cụ thể nhưng dự định bán nó cho các khách hàng khác trong tương lai gần. Tất cả các hệ thống trong hệ sinh thái cho máy khách hiện tại tạo và tiêu thụ các tệp XML nhưng điều này có thể không xảy ra đối với các máy khách khác.
Tôi đã thử những gì cho đến nay? (Hiện tại) Tôi có ý tưởng thiết kế sau dựa trên mẫu Chiến lược. Tôi đã nhanh chóng viết mã trong nhật thực để truyền đạt thiết kế của mình để thật tuyệt nếu các khía cạnh khác như cách xử lý ngoại lệ thích hợp bị bỏ qua cho đến bây giờ.
Parser: Giao diện chiến lược trưng ra một phương thức phân tích cú pháp.
public interface Parser<T> {
public T parse(String inputFile);
}
* Lý do sử dụng một tham số chung là để cho phép bất kỳ loại trả về cũng như đảm bảo an toàn loại tại thời gian biên dịch.
ProductDataXmlParser Một lớp cụ thể để phân tích tệp sản phẩm có chứa thông tin liên quan đến sản phẩm. (sử dụng 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();
}
}
trong đó : ProductDataTYPE và ProductDataDocument là các lớp POJO của XMlBean được tạo bằng xsd và lệnh scomp.
Tương lai
Nếu tôi có một tệp sản phẩm được phân tích cú pháp trong tương lai, tôi có thể xác định POJO của riêng mình được gọi là ProductData sẽ chứa các nội dung bắt buộc của tệp. Sau đó, tôi có thể tạo một lớp cụ thể có tên là ProductDataFlatFileParser thực hiện giao diện Parser và có phương thức phân tích cú pháp cho ProductData POJO cho tôi sau khi phân tích tệp.
Liệu thiết kế này có ý nghĩa? Có bất kỳ sai sót rõ ràng trong thiết kế này? Khi thiết kế đứng, tôi cho phép các lớp cụ thể xác định thuật toán phân tích một tệp và để lớp cụ thể quyết định nơi để điền dữ liệu. Thiết kế dường như phụ thuộc nhiều hơn vào các đối tượng miền hơn là các định dạng tệp. đây là một điều xấu? Bất kỳ đầu vào về cách tôi có thể cải thiện thiết kế của tôi sẽ được đánh giá cao.