Gần đây tôi đã viết một thư viện lớp bao gồm một số đối tượng mô hình một số loại tệp nhất định. Ví dụ, có một Document
lớp trừu tượng, với các lớp học có nguồn gốc PdfDocument
(bê tông) và OfficeDocument
(trừu tượng, với các lớp bê tông có nguồn gốc như WordDocument
và ExcelDocument
) vvAi phải chịu trách nhiệm lựa chọn lớp dẫn xuất thích hợp?
Hiện nay cách khách hàng tạo ra một đối tượng mới là bằng cách chọn lớp dẫn xuất thích hợp và chuyển nó vào mảng byte. Vì vậy, ví dụ, nếu tôi có một mảng byte của một PdfDocument và WordDocument, tôi sẽ làm một cái gì đó như:
var wordDocument = new WordDocument(wordDocumentByteArray);
var pdfDocument = new PdfDocument(pdfDocumentByteArray);
là thiết kế có thể chấp nhận điều này, rằng khách hàng phải biết những gì có nguồn gốc lớp sử dụng không? Hoặc tôi sẽ tốt hơn để ẩn tất cả trừ lớp trừu tượng Document
và sử dụng một cái gì đó như là một mô hình nhà máy trừu tượng để trả lại loại có nguồn gốc chính xác? ví dụ:
var wordDocument = DocumentFactory.GetDocument(wordDocumentByteArray, "docx");
// pass file extension so we know what the file is
Lưu ý rằng các loại có nguồn gốc không thêm thuộc tính/phương thức bổ sung vào lớp trừu tượng, chúng chỉ triển khai phương pháp trừu tượng theo nhiều cách khác nhau.
Chắc chắn là tùy chọn thứ 2. Cho phép khả năng mở rộng trong tương lai dễ dàng hơn và có nghĩa là mọi người dành ít thời gian hơn để cập nhật các khai báo lớp khi các loại mới, thích hợp hơn được thêm vào. –
Lớp 'Document' có mọi thứ mà người dùng cuối sẽ cần phải làm với một' Tài liệu' đã cho hay thỉnh thoảng họ (hay thường xuyên) cần truy cập vào chức năng cụ thể cho một kiểu có nguồn gốc hơn? – Servy
@Servy Có, lớp 'Document' có một phương thức trừu tượng công khai. Tất cả các lớp dẫn xuất chỉ bao gồm các phương thức trợ giúp riêng và được bảo vệ (cộng với phương thức công khai được ghi đè) với mục đích duy nhất là thực hiện một phương thức công khai. – Andrew