Misalkan saya punya metode
public List<User> GetBatchOfUsers(IEnumerable<int> userIDs)
{
List<User> users = new List<User>();
// some database stuff
return users;
}
Saya telah membaca bahwa akan lebih baik untuk mengembalikan antarmuka (baik IList
atau IEnumerable
) daripada mengembalikan List
. Beberapa argumen yang saya dengar untuk melakukannya adalah menyembunyikan data, dan memberikan pengembang API fleksibilitas untuk mengubah representasi internal data di kemudian hari.
Kekhawatiran saya hanya mengembalikan sebuah IEnumerable
adalah bahwa Anda kehilangan fungsionalitas, seperti akses acak dan Count
properti.
Saya tahu bahwa menerima IEnumerable
sebagai parameter masuk akal, karena memberikan konsumen fleksibilitas terbaik untuk mengirim data ke metode saya, persyaratan minimal untuk metode untuk beroperasi.
Apa praktik terbaik untuk tipe pengembalian?
c#
interfaces
class
Matius
sumber
sumber
Jawaban:
Secara umum, Anda bisa mulai dengan antarmuka, dan hanya bergerak untuk meletakkan tipe konkret sebagai tipe pengembalian jika Anda menemukan bahwa Anda menggunakan metode ekstra lebih sering dari yang diharapkan.
Nah, jika Anda mengembalikan antarmuka, Anda mempertahankan lebih banyak fleksibilitas. Anda dapat mengubah implementasi nanti untuk mengembalikan tipe beton yang berbeda. Di sisi lain, itu jelas memberikan informasi yang kurang penelepon, sehingga mereka mungkin tidak dapat melakukan operasi tertentu. (Misalnya: jika Anda kembali
List<T>
, penelepon dapat menggunakan ConvertAll dll ... yang tidak dapat mereka lakukan jika Anda hanya menyatakan bahwa Anda kembaliIList<T>
.) Dalam beberapa situasi, sebaiknya Anda menentukan jenis konkretnya.Mengenai metode Count atau Sortir, tidak ada antarmuka pengumpulan standar untuk itu. Namun, Anda dapat menulis metode ekstensi untuk mengurutkan atau menghitung IList apa pun.
sumber
Jika Anda memerlukan koleksi Anda untuk memiliki
Count
Anda dapat menggunakanICollection<T>
, yang cukup umum.sumber
Anda mengembalikan apa yang bijaksana untuk metode yang Anda tetapkan. Apakah yang Anda lakukan mengembalikan serangkaian item (fokus ada pada item), atau mengembalikan koleksi item (fokusnya adalah pada koleksi secara keseluruhan)? Apakah ada gunanya membiarkan perbedaan dalam implementasi koleksi? Jika tidak akan pernah masuk akal untuk menggunakan generator atau
HashSet
hanya menggunakanList
.sumber
Khusus untuk metode contoh: Anda benar bahwa mengembalikan
IEnmuerable<T>
berarti Anda akan kehilangan fungsionalitasCount
dan pengindeksan (meskipun Anda dapat menggunakan metodeCount()
dan LINQElementAt()
, yang diterapkan secara efisien jika jenis yang mereka gunakan benar-benar mengimplementasikanIList<T>
).Jika Anda kembali
IList<T>
, Anda akan kehilangan beberapa fungsionalitas, tetapi keuntungan secara umum mungkin sepadan.Tetapi bahkan lebih baik akan menjadi sesuatu di antara
IEnumerable<T>
danIList<T>
, karena kemungkinan besar tidak masuk akal bagi konsumen untuk mengubah koleksi yang dikembalikan, tetapi masuk akal baginya untuk menggunakanCount
atau mengindeks.Di Net 4.5, ada antarmuka seperti:
IReadOnlyList<T>
.sumber
IReadOnlyList
kedengarannya bagus ketika saya bisa mendapatkan VS2013, terima kasih!