2010-10-05 17 views
11

Tôi cần ý kiến ​​của bạn về điều này bởi vì tôi đã đọc rất nhiều điều khác nhau về chủ đề này. Nếu bạn có một List<T> hoặc bất kỳ loại danh sách nào trong một khai báo lớp, bạn có đặt nó ở chế độ riêng tư và sau đó thêm hoặc xóa các mục bằng cách sử dụng các phương thức cụ thể hoặc làm cho nó công khai không?Danh sách <T> có phải là riêng tư không?

Lượt xem của bạn sẽ được đánh giá cao với bất kỳ bất lợi/lợi thế nào của từng tùy chọn.

Ví dụ: giả sử chúng ta có class Employer với trường riêng nameList<Employees>. Câu hỏi của tôi là nếu chúng ta nên đặt danh sách nhân viên ở chế độ riêng tư hoặc công khai và những lợi thế/bất lợi sẽ xảy ra ở cả hai trường hợp.

+2

Bạn có thể muốn mở rộng một chút về bối cảnh đó là một câu hỏi rất rộng với việc thông tin bối cảnh rất ít khó khăn để cung cấp cho bạn một câu trả lời chính xác –

+0

Tại sao DoNotExposeGenericLists [FxCop Rule] khuyên tôi tiếp xúc với Bộ sưu tập thay vì Danh sách ? http://blogs.msdn.com/b/codeanalysis/archive/2006/04/27/585476.aspx –

Trả lời

6

cho Danh sách một cách rõ ràng có nó nên tin tùy thuộc vào những gì các chức năng bạn đang phơi bày là nghĩa vụ phải làm, giao diện như IEnuemerable, ICollection hoặc IList sẽ là một lựa chọn tốt hơn hoặc nếu bạn đang phơi bày một bộ sưu tập Xem SLaks trả lời .

Nói chung hiển thị cấu trúc bên trong và trạng thái là một ý tưởng tồi và vì đối tượng của bạn trong Danh sách loại là cả hai, bạn sẽ muốn giữ nội bộ. Nó có thể có ý nghĩa để cung cấp cho người dùng khả năng lặp qua nó, để thêm hoặc xóa các mục vào nó, nhưng bạn vẫn nên giữ Danh sách bên trong và hiển thị các phương thức Thêm/Loại bỏ hoặc làm tối thiểu giao diện làm cho nó có thể thay đổi loại biểu diễn bên trong có ảnh hưởng đến giao diện công khai.

Hơn nữa nếu bạn đang phơi bày bằng giao diện, bạn nên đi đến giao diện hẹp nhất có thể.

Vì vậy, nếu mã máy khách chỉ cần liệt kê nó. sử dụng IEnumerable nếu mã máy khách cần sử dụng chỉ mục ICollection và vv.

hơn nữa nếu bạn phơi bày như một IEnumerable bạn nên chắc chắn rằng những gì bao giờ bạn quay được trên thực tế chỉ đọc bằng một trong hai cách sử dụng một chỉ lớp tập đọc hoặc bằng cách sử dụng một khối iterator

EDIT sau khi cập nhật Liên quan đến ví dụ của bạn. Hãy tự hỏi mình có ý nghĩa rằng bất kỳ ai ngoại trừ nhà tuyển dụng có thể thay đổi nhân viên của mình là ai không? với tôi đó là những từ bạn đã chọn. Người sử dụng lao động sử dụng nhân viên và phải có toàn quyền kiểm soát đối với nhân viên của họ.Vì vậy, trong trường hợp cụ thể này, tôi sẽ giữ nó riêng tư và cho thuê (nhân viên IEmployee) và Fire (nhân viên IEmployee) theo cách mã rõ ràng ý định

+0

Đã được viết lên cùng một điều ... BUt kể từ khi ông nói nó tốt hơn nhiều so với tôi có thể ... 1. –

4

Nếu bạn cần trưng bày bộ sưu tập cho người dùng của lớp học, bạn nên tạo thuộc tính chỉ đọc với System.Collections.ObjectModel.Collection<T>.

Sau đó, bạn có thể kế thừa lớp này và ghi đè InsertItem, RemoveItemSetItem để chạy logic tùy chỉnh khi người dùng thao tác bộ sưu tập.

Nếu bạn không muốn người dùng có thể thay đổi bộ sưu tập, bạn nên hiển thị ReadOnlyCollection<T>.

Trong ví dụ cụ thể của bạn, có lẽ bạn nên để lộ ReadOnlyCollection<Employee> với các phương pháp biến đổi riêng biệt trong Employer.

+1

Tại sao "Bộ sưu tập " cụ thể? Chắc chắn điều đó phụ thuộc vào chức năng nào bạn muốn phơi bày: 'IList ', 'ReadOnlyCollection ', 'IEnumerable ' vv là một số khả năng khác. – LukeH

+1

@LukeH: Hãy nhớ về các cuộc tấn công sửa đổi theo từng diễn viên. Tuy nhiên, bạn nói đúng; không có gì sai khi trưng ra một 'Bộ sưu tập ' như một 'IList '. – SLaks

+0

Hoặc 'trả về danh sách.Chọn (a => a)' – SLaks

0

Phụ thuộc vào chức năng bạn muốn. Nếu bạn chỉ muốn mọi người có thể thao tác trong danh sách, bạn có thể phơi bày nó thông qua một thuộc tính chỉ đọc (không có setter). Nếu bạn muốn mã bổ sung được thực hiện khi người dùng thao tác danh sách, bạn nên viết các phương thức của riêng mình và không hiển thị danh sách.

1

Theo danh mục tái cấu trúc, nó luôn tốt hơn để gói gọn bộ sưu tập. Điều này ngăn cản một số người vô tình làm hỏng dữ liệu bằng cách thêm hoặc xóa các mục khỏi danh sách. Nếu bạn không cần chức năng bảo vệ dữ liệu của bạn từ những thay đổi ngẫu nhiên, bạn có thể trả về một danh sách bình thường.

Bằng cách hiển thị các phương thức Thêm và Xóa, bạn nhận được lợi thế mà bất kỳ thay đổi nào chỉ xảy ra thông qua các phương pháp này.

3

Và nếu tất cả những gì bạn muốn là để ai đó có thể liệt kê danh sách, bạn có thể hiển thị một hàm iEnumerable mà hàm GetEnumerator chỉ đơn giản gọi hàm GetEnumerator của danh sách.

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