"chấp nhận ít nhất bạn có thể, nhưng trả lại tối đa" là những gì tôi ủng hộ. Khi một phương thức trả về một đối tượng, chúng ta sẽ không trả về loại thực tế và giới hạn các khả năng của đối tượng bằng cách trả về một kiểu cơ sở. Điều này tuy nhiên đặt ra một câu hỏi làm thế nào để chúng ta biết những gì "tối đa" (loại thực tế) sẽ được khi chúng tôi thiết kế một giao diện. Câu trả lời rất đơn giản. Chỉ trong trường hợp cực đoan mà người thiết kế giao diện đang thiết kế một giao diện mở, sẽ được thực hiện bên ngoài ứng dụng/thành phần, họ sẽ không biết loại trả về thực tế có thể là gì. Một nhà thiết kế thông minh nên luôn luôn xem xét những gì phương pháp nên được làm và những gì một loại trả về tối ưu/chung chung nên được.
Ví dụ: Nếu tôi đang thiết kế một giao diện để lấy ra một vectơ các đối tượng, và tôi biết số lượng các đối tượng được trả về sẽ biến đổi, tôi sẽ luôn luôn giả sử một nhà phát triển thông minh sẽ luôn sử dụng một Danh sách. Nếu ai đó có kế hoạch trả lại một mảng, tôi sẽ đặt câu hỏi về khả năng của anh ta, trừ khi anh ấy/cô ấy chỉ trả lại dữ liệu từ một lớp khác mà anh ta/cô ấy không sở hữu. Và đây có lẽ là lý do tại sao FxCop ủng hộ ICollection (cơ sở chung cho Danh sách và Mảng).
Trên đây đang được nói, có vài thứ khác để xem xét
Liên quan đến đánh giá lười biếng LINQ Tôi chắc chắn 95% người dùng C# không hiểu thông tin. Nó không phải như vậy. OO thúc đẩy các thay đổi trạng thái cụ thể về các lời gọi phương thức. LINQ lười biếng đánh giá thúc đẩy thay đổi trạng thái thời gian chạy trên mô hình đánh giá biểu hiện (không phải là một cái gì đó không cao cấp người dùng luôn luôn làm theo).
Nguồn
2011-12-06 15:36:49
Như OP chỉ ra, nếu một lớp cụ thể cần được trả về, FxCop khuyên trả về một 'Bộ sưu tập' thay vì 'Danh sách '. Ngoài ra, hãy xem [Bộ sưu tập so với Danh sách bạn nên sử dụng những gì trên giao diện của mình?] (http://stackoverflow.com/q/271710/1497596). –
DavidRR