Giao diện List có phải là một bản tóm tắt bị rò rỉ không?


9

Nếu tôi có một biến chứa một biến Listthì nó có thể chứa các đối tượng có nhiều loại khác nhau, ví dụ như ArrayListhoặc LinkedList. Sự khác biệt giữa a LinkedListvà an ArrayListlà khá lớn. Hành vi O lớn của các phương pháp khác nhau rất nhiều. Ví dụ: sắp xếp Listvà sau đó sử dụng nó để thực hiện tìm kiếm nhị phân là hoàn toàn ổn đối với một ArrayListnhưng sẽ không có ý nghĩa với a LinkedList.


"O lớn" có nghĩa là gì?
Tulains Córdova

Câu trả lời:


25

Tôi sẽ không nói như vậy.

Một sự trừu tượng bị rò rỉ là một điều bắt buộc bạn phải xử lý các chi tiết thực hiện mà nó được cho là trừu tượng hóa. Nhưng hiệu suất luôn khác nhau giữa các lần triển khai, vì vậy nếu bạn tính đó là rò rỉ, thì không có sự trừu tượng hóa không bị rò rỉ.

Nếu một cái gì đó được tuyên bố là Listkhông có thêm tài liệu, thì nên hiểu rằng đơn giản là không có gì đảm bảo về hiệu suất, và nếu bạn sẽ làm bất cứ điều gì nhạy cảm với hiệu suất với nó, bạn nên tạo một bản sao và làm việc với nó.

Ngoài ra, đừng quên rằng có một giao diện thậm chí còn chung chung hơn về chức năng và không cám dỗ bạn đưa ra nhiều giả định về hiệu suất : Collection.


9
Có một giao diện thậm chí còn chung hơn thường là đủ về chức năng : Iterable.
emory

Hiệu suất khác nhau giữa các triển khai khác nhau được dự kiến. Ví dụ, có sự khác biệt giữa Vector và ArrayList, nhưng thao tác get trên LinkedList có vẻ lạ.
Paling

17

Tất cả các khái niệm trừu tượng không tầm thường, ở một mức độ nào đó, đều bị rò rỉ. Điều đó nói rằng, tôi không thực sự chắc chắn rằng nó áp dụng ở đây. :-)

Trừu tượng có liên quan với hành vi. Trừ khi hành vi chỉ định hiệu năng cụ thể (mà Java Listkhông có) thì đó là một chi tiết triển khai - tức là không liên quan.

Java không cho phép bạn chỉ định hiệu suất tối thiểu cho các giao diện bên ngoài tài liệu và tôi không biết bất kỳ ngôn ngữ nào - điều này sẽ cực kỳ khó (không thể?) Để trình biên dịch xác minh. Tôi có thể thấy một vài lựa chọn nếu hiệu suất là một mối quan tâm:

  1. Tài liệu nó trong lớp / giao diện, thể hiện danh sách sẽ thuộc về.
  2. Tạo một giao diện mới - ví dụ BinarySearchPerformantList(yuck!) - trong đó chỉ định các yêu cầu về hiệu suất của các phương thức khác nhau.

Tùy chọn 2 có lẽ là sự trừu tượng tốt hơn, nhưng đi kèm với chi phí phụ.


1
+1. Về mặt kỹ thuật có, Danh sách là một sự trừu tượng bị rò rỉ , nhưng đối tượng cũng vậy để che giấu sự phức tạp liên quan đến việc sử dụng equalsđể so sánh các đối tượng.
Neil

2
@Neil Tôi nghĩ nó gây tranh cãi ... Vì sự trừu tượng không đề cập đến hiệu suất nên tôi không nghĩ nó thất bại trong trường hợp này (như tôi đã tranh luận). Tôi muốn nói rằng nếu bạn đang nghĩ về hiệu suất, bạn cần một sự trừu tượng khác / hẹp hơn. Sẽ chỉnh sửa để đề cập đến điều đó.
vaughandroid

Nó phụ thuộc vào những gì bạn đang che giấu tôi cho rằng. Là sự phức tạp trong việc sử dụng hay là trong việc sử dụng và thực hiện bộ nhớ của nó? Bởi vì nếu nó là một lớp trừu tượng, một hoặc nhiều trong số các phức tạp này sẽ bị ẩn theo cách này hay cách khác.
Neil

Tôi chơi xung quanh trong nhiều năm trở lại thực hiện một biến thể của Lựa chọn 2 sử dụng giao diện đánh dấu như LinearSpaceLogarithmicTimevà sau đó tuyên bố các lớp học như public class BinarySearch : ISearchStrategy<T>, LogarithmicTime. Các lớp khác có thể lấy các tham số như public T find<T, S>(IList<T> list, S strategy) where S : ISearchStrategy<T>, LogarithmicTime { }để thực thi các ràng buộc hiệu năng.
Lucas

2
Nếu chúng ta đi theo bài báo Joel Spolsky, tôi nghĩ đó là "ở một mức độ nào đó, rò rỉ". Xem trích dẫn sau đây từ bài viết: "Nếu bạn bị quản trị viên hệ thống trong công ty của bạn và họ trừng phạt bạn bằng cách cắm bạn vào một trung tâm quá tải, chỉ một số gói IP của bạn sẽ vượt qua và TCP sẽ hoạt động, nhưng mọi thứ sẽ hoạt động hãy thật chậm "Tôi nghĩ điều này được áp dụng
Lập trình viên Amish

4

Trong Java, có một giao diện RandomAccess được định nghĩa là một danh sách với thời gian truy cập ngẫu nhiên thường xuyên (O (1) get, put, v.v.). Nếu bạn cảm thấy mô-đun của mình yêu cầu một danh sách với các đặc điểm hiệu suất đó, hãy cân nhắc sử dụng RandomAccessthay vì List. Nếu bạn không cảm thấy cần phải thực hiện thay đổi đó (và một số ít làm), thì có lẽ Danh sách không bị rò rỉ.


1

Bạn đã đúng, một Danh sách là một sự trừu tượng bị rò rỉ. STL sử dụng ý tưởng về các khái niệm để mô hình hóa vấn đề cụ thể này. Để sử dụng ví dụ của bạn, một ArrayListmô hình Trình lặp truy cập ngẫu nhiên trong khi LinkedList mô hình Trình lặp chuyển tiếp . Các khái niệm khác nhau có các yêu cầu hiệu suất khác nhau, điều này làm cho chúng phù hợp với các thuật toán khác nhau .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.