Giao diện trả về hoặc lớp


9

Giả sử tôi có một phương pháp

public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
    List<User> users = new List<User>();

    // some database stuff

    return users;
}

Tôi đã đọc được rằng sẽ tốt hơn nếu trả về một giao diện (hoặc IListhoặc IEnumerable) thay vì trả lại a List. Một số đối số mà tôi đã nghe để làm như vậy là nó che giấu dữ liệu và cung cấp cho nhà phát triển API tính linh hoạt trong việc thay đổi biểu diễn bên trong của dữ liệu vào một ngày sau đó.

Mối quan tâm của tôi về việc chỉ trả lại một IEnumerablelà bạn mất chức năng, chẳng hạn như truy cập ngẫu nhiên và Counttài sản.

Tôi biết rằng việc chấp nhận IEnumerablenhư một tham số có ý nghĩa, vì nó mang lại cho người tiêu dùng sự linh hoạt tốt nhất để gửi dữ liệu đến phương thức của tôi, tập hợp các yêu cầu tối giản để phương thức hoạt động.

Thực hành tốt nhất cho loại trở lại là gì?


5
Quan trọng hơn nhiều: lấy một giao diện làm kiểu tham số.
Michael Borgwardt

Câu trả lời:


10

Nói chung, bạn có thể bắt đầu với các giao diện và chỉ di chuyển để đặt loại cụ thể làm loại trả về nếu bạn thấy rằng bạn sử dụng các phương thức bổ sung thường xuyên hơn dự kiến.

Chà, nếu bạn trả lại một giao diện, bạn sẽ giữ được sự linh hoạt hơn. Bạn có thể thay đổi việc thực hiện sau đó để trả về một loại cụ thể khác. Mặt khác, nó rõ ràng cung cấp cho người gọi ít thông tin hơn, vì vậy họ có thể không thể thực hiện các hoạt động nhất định. (Ví dụ: nếu bạn quay lại List<T>, người gọi có thể sử dụng Convert ALL, v.v ... mà họ không thể nếu bạn chỉ tuyên bố rằng bạn quay lại IList<T>.) Trong một số trường hợp, bạn nên chỉ định loại cụ thể.

Về phương pháp Count hoặc Sort, không có giao diện thu thập tiêu chuẩn nào cho điều đó. Tuy nhiên, bạn có thể viết một phương thức mở rộng để sắp xếp hoặc đếm bất kỳ IList nào.


Tôi đoán đây không thực sự là một quy tắc khó?
Matthew

vâng, nó thực sự phụ thuộc vào cách sử dụng.
Yusubov

1

Nếu bạn cần bộ sưu tập của bạn để có một Countbạn có thể sử dụng ICollection<T>, đó là đủ chung.


-1. Count đã được thảo luận và câu trả lời này không có gì mới
superM

@Konrad Rudolph, đây không phải là một câu trả lời, đó là một nhận xét.
superM

@superM Nó đủ giá trị để xứng đáng với câu trả lời của riêng mình, tôi nghĩ, vì nó giải quyết rõ ràng lý do của OP khi quyết định chống lại các giao diện ở nơi đầu tiên.
Konrad Rudolph

1

Bạn trả lại những gì là thận trọng cho phương pháp bạn đang xác định. Là những gì bạn đang làm trả lại một loạt các mặt hàng (trọng tâm là các mặt hàng), hoặc nó sẽ trả lại một bộ sưu tập các mặt hàng (trọng tâm là toàn bộ bộ sưu tập)? Có đáng để cho phép phương sai trong việc thực hiện bộ sưu tập không? Nếu nó sẽ không bao giờ có ý nghĩa để sử dụng một máy phát điện hoặc HashSetsau đó chỉ sử dụng List.


1

Cụ thể với phương pháp ví dụ: Bạn nói đúng rằng việc quay lại IEnmuerable<T>có nghĩa là bạn sẽ mất chức năng Countvà lập chỉ mục (mặc dù bạn có thể sử dụng các phương thức LINQ Count()ElementAt(), được triển khai hiệu quả nếu loại chúng được sử dụng trên thực tếIList<T> ).

Nếu bạn quay trở lại IList<T>, bạn sẽ mất một số chức năng, nhưng việc đạt được tính tổng quát có lẽ là xứng đáng.

Nhưng thậm chí tốt hơn sẽ là một cái gì đó giữa IEnumerable<T>IList<T>, bởi vì rất có thể người tiêu dùng không thể thay đổi bộ sưu tập được trả lại, nhưng nó có ý nghĩa đối với anh ta để sử dụng Counthoặc lập chỉ mục.

Trong .Net 4.5, có giao diện như vậy : IReadOnlyList<T>.


IReadOnlyListNghe có vẻ hay khi tôi có thể nhận được VS2013, cảm ơn!
Matthew
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.