Tại sao chúng ta nên sử dụng bộ sưu tập hạng nhất?


15

Theo quy tắc số 4 của Object Calisthenics của Jeff Bay (RTF) trong The Th ThinkWorks Anthology, chúng tôi khuyên bạn nên " Sử dụng các bộ sưu tập hạng nhất ".

Quy tắc 4: Bộ sưu tập hạng nhất

Áp dụng quy tắc này rất đơn giản: bất kỳ lớp nào chứa bộ sưu tập sẽ không chứa các biến thành viên khác. Mỗi bộ sưu tập được bọc trong lớp riêng của nó, vì vậy bây giờ các hành vi liên quan đến bộ sưu tập có một ngôi nhà. Bạn có thể thấy rằng các bộ lọc trở thành một phần của lớp mới này. Ngoài ra, lớp mới của bạn có thể xử lý các hoạt động như tham gia hai nhóm với nhau hoặc áp dụng quy tắc cho từng thành phần của nhóm.

Điều tôi có thể hiểu từ điều này là chúng ta nên sử dụng một lớp riêng để gói bộ sưu tập và với các phương thức để thêm, xóa sửa đổi dữ liệu của bộ sưu tập đó.

và chúng tôi cần điều này để chúng tôi chắc chắn về kiểu dữ liệu nào đi vào bộ sưu tập và những gì xuất hiện.

Trong trường hợp chúng tôi sử dụng bộ sưu tập chung (bằng ngôn ngữ áp dụng), chúng tôi có cần tuân theo quy tắc này không?

Nếu tôi thiếu một ý nghĩa quan trọng, xin vui lòng làm rõ.


1
Amogh Talpallikar Tôi đã thay đổi quy tắc 8 thành quy tắc 4, vì quy tắc 8 thực sự là "Không có lớp nào có nhiều hơn hai biến thể hiện".
yannis

Dường như nói Quy tắc 8 trong mục lục và sau đó gọi nó là Quy tắc 4 trong phần thân.
Vô dụng


6
Có phải chỉ có tôi, hoặc quy tắc này không thể thực hiện được như văn bản? Ý tôi là, bạn đã có một lớp học với một bộ sưu tập trong đó, vì vậy bạn lấy mọi thứ khác ra. Bây giờ lớp học của bạn là một bộ sưu tập. Vì vậy, nếu bạn có một lớp khác, với lớp đó trong đó, nó có một bộ sưu tập trong đó, và ... sau đó, rửa sạch, lặp lại.
mjfgates

@mjfgates: hmm ... Điểm tuyệt vời! một cái gì đó để thực sự nghĩ về!
Amogh Talpallikar

Câu trả lời:


12

Loại an toàn là một lý do rất nhỏ để sử dụng các bộ sưu tập hạng nhất. Từ liên kết của bạn:

Quy tắc 4: Bộ sưu tập hạng nhất Áp dụng quy tắc này rất đơn giản: bất kỳ lớp nào chứa bộ sưu tập sẽ không chứa các biến thành viên khác. Mỗi bộ sưu tập được bọc trong lớp riêng của nó, vì vậy bây giờ các hành vi liên quan đến bộ sưu tập có một ngôi nhà. Bạn có thể thấy rằng các bộ lọc trở thành một phần của lớp mới này. Ngoài ra, lớp mới của bạn có thể xử lý các hoạt động như tham gia hai nhóm với nhau hoặc áp dụng quy tắc cho từng thành phần của nhóm.

Ý tưởng ở đây là nếu bạn thấy mình đang tìm kiếm, lọc, xác nhận hợp lệ hoặc bất cứ điều gì ngoài việc thêm / xóa / lặp lại ngữ nghĩa trên một bộ sưu tập, mã sẽ yêu cầu bạn đặt nó vào lớp riêng của nó. Nếu bạn cần cập nhật chỉ một giá trị (sau khi tìm kiếm), điều đó có thể nằm trong lớp bộ sưu tập.

Lý do cho điều này là khá đơn giản, các bộ sưu tập có xu hướng được thông qua xung quanh. Ngay sau đó, 4 lớp khác nhau có SearchByID()phương pháp riêng . Hoặc bạn nhận được các giá trị trả về như Map<Integer, String>với bối cảnh của những gì được lưu trữ trong bản đồ đó bị tước đi. Một bộ sưu tập hạng nhất là một giải pháp đơn giản có giá một tệp nguồn duy nhất. Trong thực tế, một khi đã có sẵn (chúng cũng rất dễ dàng để viết bài kiểm tra đơn vị), mọi thay đổi liên quan đến bộ sưu tập đều dễ xử lý, như khi SearchByIDcần phải thực hiện GUID thay vì int.


8

... sử dụng một lớp riêng bao bọc bộ sưu tập và với các phương thức để thêm, xóa sửa đổi dữ liệu của bộ sưu tập đó

Điều này không chỉ đảm bảo loại đối tượng được lưu trữ trong các bộ sưu tập, nó cũng đảm bảo bất kỳ bất biến bộ sưu tập nào.

Cây (đỏ-đen, AVL, v.v.) rất nhạy cảm với trật tự và hành vi của chúng phụ thuộc vào việc tái cân bằng khi thích hợp. Hiệu suất bảng băm cũng sẽ phụ thuộc vào băm lại thích hợp. Bạn có muốn nhớ kiểm tra hệ số tải mỗi lần bạn chèn vào bản đồ băm không?

FWIW, văn bản khá rõ ràng về điều này (và tôi sẽ chỉnh sửa toàn bộ câu hỏi của bạn, vì vậy không ai khác cần tải xuống RTF đó):

Mỗi bộ sưu tập được bọc trong lớp riêng của nó, vì vậy bây giờ các hành vi liên quan đến bộ sưu tập có một ngôi nhà

Không có gì để làm với các loại (hoặc do đó là chung chung), mọi thứ phải làm với việc liên kết hành vi của bộ sưu tập với dữ liệu của nó.


1

Câu trả lời đơn giản là "Không" nếu bạn đang sử dụng ngôn ngữ hỗ trợ Generics. Bởi vì không cần phải kiểm tra loại vì tính năng ngôn ngữ tự nó làm rất tốt công việc này (Từ kinh nghiệm chung về Java của tôi).

Nhưng nếu bạn có bất kỳ tình huống nào mà bạn muốn tùy chỉnh cấu trúc dữ liệu được cung cấp từ ngôn ngữ, Bạn có thể tạo một lớp bao bọc xung quanh cấu trúc dữ liệu gốc và hiển thị API của riêng bạn và vẫn sử dụng triển khai cơ bản của cấu trúc dữ liệu gốc.


Tôi cũng đang suy nghĩ trong các dòng tương tự. nhưng cần phải có một cái gì đó, các ví dụ tôi thấy cho điều này là trong Java và C # và cả hai đều hỗ trợ các bộ sưu tập chung.
Amogh Talpallikar

@AmoghTalpallikar: Quan điểm của tôi là giữ cho nó đơn giản. Trừ khi tôi không cần ghi đè bất kỳ hành vi cụ thể nào của cấu trúc dữ liệu, tôi sẽ không tùy chỉnh.
java_mouse
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.