2012-07-02 19 views
8

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ư WordDocumentExcelDocument) 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.

+0

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. –

+0

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

+0

@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

Trả lời

9

Cách tiếp cận thứ hai tốt hơn nhiều so với phương pháp thứ nhất, vì nó che giấu sự thật về sự tồn tại của tài liệu Word và Pdf từ người dùng thư viện của bạn. Điều này đặc biệt quan trọng khi bạn quyết định thêm nhiều loại tài liệu hơn - ví dụ: Rtf, Html, v.v.: người dùng sẽ nhận được lợi ích của các loại mới được thêm mà không phải biên dịch lại mã của họ. Trong thực tế, họ thậm chí sẽ không nhận thấy rằng bạn đã thay đổi bất cứ điều gì: nếu làm đúng, mã của họ sẽ "chỉ làm việc" với các tài liệu thuộc loại họ chưa bao giờ biết tồn tại.

P.S. Nếu bạn có thể quét mảng byte và tìm ra loại chính xác từ nó, API của bạn có thể "kiếm được một số điểm cho phong cách" bằng cách loại bỏ tham số thứ hai.

+0

Cảm ơn. Tôi chắc chắn sẽ xem xét nếu tôi có thể tìm ra loại từ mảng byte, lý do duy nhất tôi thêm phần mở rộng trong ví dụ của tôi là bởi vì từ một số nghiên cứu rất ngắn gọn, có vẻ như không có phương pháp xác định tệp nào nhập từ biểu diễn nhị phân mỗi lần. – Andrew

3

Nếu các kiểu dẫn xuất không thêm bất kỳ thuộc tính/phương thức nào và bạn có khả năng xác định loại sử dụng cho một byte [], tôi thậm chí sẽ không tạo các lớp dẫn xuất công khai ... diện tích bề mặt của những thứ mà người tiêu dùng sẽ phải phân tích khi học thư viện của bạn. Chỉ cần có một phương thức nhà máy tĩnh giống như public static Document OpenDocument(byte[] data) trong lớp Tài liệu.

+0

Cảm ơn. Tôi sẽ đi với các phương pháp nhà máy thay vì một nhà máy trừu tượng (mà dường như quá mức cần thiết cho những gì tôi cần phải thực hiện). – Andrew

+0

* "Nếu các kiểu dẫn xuất không thêm bất kỳ thuộc tính/phương thức nào" * Đó là một "if" khá lớn. Có rất nhiều thứ có thể hình dung được với một loại tệp đã biết mà không thể thực hiện với một "Tài liệu" chung. – Servy

+0

@Servy Tôi đồng ý nhưng với mục đích thư viện của tôi, mà tôi không nêu trong câu hỏi, tất cả những gì nó làm là thực hiện một số sửa đổi đối với dữ liệu nhị phân.Các chức năng là khá cụ thể vì vậy trong trường hợp này tôi nghĩ rằng giả định là ok (chỉ cần cho các lớp học có nguồn gốc ở nơi đầu tiên là bởi vì những thay đổi và thực hiện của họ khác nhau tùy theo loại tập tin). – Andrew

Các vấn đề liên quan