2012-06-27 42 views
13

Hãy nói rằng tôi có một tập tin CSV và tôi tạo ra một lớp gọi là CsvFile mà kéo dài từ java.io.File. Lớp này có thể phân tích cú pháp tệp CSV và trả lại một số dữ liệu như số lượng cột trong tệp. Nó cũng có thể được sử dụng cho các chức năng mất java.io.File làm đầu vào. Giống như F ileUtils.copyFile(File from, File to).Sẽ đóng gói phá vỡ kế thừa?

Đồng nghiệp của tôi nghĩ rằng tôi tiếp xúc với quá nhiều từ thừa kế. Ý tưởng của ông là để bọc java.io.File bằng cách giữ nó trong một tài sản tư nhân, thay vì kế thừa nó. Ông nghĩ rằng phơi bày tất cả các phương pháp công cộng/tài sản từ đóng gói tập tin đóng gói, nhưng tôi lấy nó như là một lợi ích kể từ khi chúng tôi nhận được tất cả các chức năng trong java.io.File miễn phí.

Bạn nghĩ gì?

+0

Hoặc là tôi nghĩ là không, nhưng kết hợp cả hai là cách. Kế thừa đầu tiên để bánh xe không được sáng tạo lại, so với các mẫu bao bọc để bánh xe phục vụ mục đích của nó. –

Trả lời

15

Tôi thà đồng ý với đồng nghiệp của bạn: kế thừa java.util.File sẽ phơi bày phương pháp mà không được áp dụng để CsvFile đối tượng, chẳng hạn như list(), listFiles(), setExecutable(), và vân vân.

Làm cho java.util.File thuộc tính phía sau bộ thu phát giống như lựa chọn tốt hơn: nó không tiết lộ các hoạt động không liên quan đến người dùng trong lớp của bạn và cho phép bạn kế thừa từ lớp cơ sở bạn chọn.

+1

để thêm vào câu trả lời: có, trong trường hợp thừa kế này sẽ phá vỡ đóng gói bằng cách rò rỉ chi tiết triển khai tệp CVS được triển khai bằng cách sử dụng java.io.File – Soronthar

+1

nó có thể không phải là trường hợp hoặc. Kế thừa để tùy chỉnh, hơn quấn để thu hẹp các phương thức bạn muốn hiển thị. –

+0

Hoặc là tôi nghĩ là không, nhưng kết hợp cả hai là cách. Kế thừa đầu tiên để bánh xe không được sáng tạo lại, so với các mẫu bao bọc để bánh xe phục vụ mục đích của nó. –

5

Tôi nghĩ tất cả phụ thuộc vào mục đích của lớp học. Nếu bạn thực sự cố gắng mở rộng hành vi thì tôi sẽ nói nó có ý nghĩa. Nếu bạn không mở rộng hành vi của Tệp nhưng chỉ tạo một đối tượng CSV thì việc đóng gói sẽ giới hạn hành vi của nó đối với chỉ những gì nó có ý định.

1

Bạn cũng có thể xem xét làm cho nó trở nên chung chung hơn để có thể chấp nhận InputStream hoặc Reader được định dạng CSV từ nhiều nguồn khác nhau (hoặc không thể dễ dàng) phát ra hệ thống tệp. Bạn vẫn có thể có một hàm setter/constructor java.io.File để thuận tiện.

1

Đây thực sự là một cuộc tranh luận tuyệt vời. Đồng nghiệp của bạn ở phía bên phải của lịch sử về điều này. Nói chung câu hỏi về thừa kế đi xuống đến các mối quan hệ của is-a so với has-a. Nói chung, nó linh hoạt hơn khi sử dụng bố cục hơn là thừa kế. Trong trường hợp của bạn, đó là một cuộc gọi gần. Sau khi tất cả tệp csv isa. nói rằng csvfile có một tập tin thậm chí không nghe đúng. Những gì có thể được coi là tốt để làm thừa kế nhưng hơn bọc các tập tin thừa kế để chỉ những phương pháp tập tin CSV mà bạn muốn được tiếp xúc. Tôi cũng sẽ xem xét một số mẫu thiết kế xung quanh nơi bạn muốn kế thừa từ A nhưng đưa ra một giao diện hạn chế hơn cho thế giới. Tôi gần như chắc chắn có một mẫu thiết kế cho việc này. chỉ không thể nhớ tên ....

"Hoặc là hay tôi nghĩ là không, nhưng kết hợp cả hai là đường đi. Đầu tiên thừa kế sao cho bánh xe không được tái phát minh, hơn là mô hình mà gói gọn để các bánh xe phục vụ của nó mục đích."

0

Có thể quan điểm của tôi quá tự do nhưng ... Đóng gói và thừa kế có lý do. (Xem 'sự tiến hóa' từ các trình biên dịch sang các ngôn ngữ bậc cao.) Lý do đó là lập trình viên. Với trừu tượng mức cao hơn/mô hình bạn có thể viết mã tốt hơn. Bí quyết là để xác định 'tốt hơn' tất nhiên. Đối với tôi, đây là khả năng bảo trì, tự tài liệu và sử dụng lại mã. Đó là lý do tại sao tôi sẽ chọn đóng gói trên thừa kế trong trường hợp cụ thể của bạn. Có lẽ đó là một chút công việc để viết nó một lần, nhưng sooooo dễ dàng hơn nhiều để duy trì trong tương lai. (Giả sử thứ CSV này là một phần của một dự án lớn hơn tất nhiên.)

0

Cách tiếp cận đồng nghiệp của bạn cũng đề cập đến có những lợi ích mà API của bạn trở nên rất nhỏ bởi chỉ phương pháp bạn thực sự cần phải phơi bày - mà làm cho nó rõ ràng làm thế nào để người sử dụng cách sử dụng lớp học của bạn (bạn có thể nghĩ về API công khai của mình như một số loại tài liệu).

0

Đối với câu hỏi của bạn

sẽ thừa kế phá vỡ đóng gói?

Sau đó, theo hiệu quả Java Joshua Bloch, thừa kế luôn luôn phá vỡ đóng gói:

Không giống như các phương pháp gọi, thừa kế vi phạm đóng gói [Snyder86]. Nói cách khác, một phân lớp phụ thuộc vào việc triển khai thực hiện các chi tiết của lớp cha của nó cho chức năng thích hợp của nó.

Về việc bạn nên sử dụng thừa kế hoặc thành phần, như nhiều người đã nói, nó phụ thuộc vào nếu CsvFile của bạn là-một tập tin, theo nghĩa java.util.File.

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