Saya sedang mengembangkan perpustakaan yang ditujukan untuk rilis publik. Ini berisi berbagai metode untuk beroperasi pada set objek - menghasilkan, memeriksa, mempartisi dan memproyeksikan set ke dalam bentuk baru. Dalam hal ini relevan, ini adalah perpustakaan kelas C # yang berisi ekstensi gaya LINQ aktif IEnumerable
, yang akan dirilis sebagai paket NuGet.
Beberapa metode di pustaka ini dapat diberikan parameter input yang tidak memuaskan. Sebagai contoh, dalam metode kombinatorik, ada metode untuk menghasilkan semua set n item yang dapat dibangun dari set sumber item m . Misalnya, diberikan set:
1, 2, 3, 4, 5
dan meminta kombinasi 2 akan menghasilkan:
1, 2
1, 3
1, 4
dll ...
5, 3
5, 4
Sekarang, sangat mungkin untuk meminta sesuatu yang tidak dapat dilakukan, seperti memberikannya satu set 3 item dan kemudian meminta kombinasi 4 item sambil mengatur opsi yang mengatakan itu hanya dapat menggunakan setiap item sekali.
Dalam skenario ini, setiap parameter valid secara individual :
- Pengumpulan sumber tidak nol, dan memang mengandung item
- Ukuran kombinasi yang diminta adalah bilangan nol bukan positif
- Mode yang diminta (gunakan setiap item hanya sekali) adalah pilihan yang valid
Namun, keadaan parameter saat diambil bersama-sama menyebabkan masalah.
Dalam skenario ini, apakah Anda mengharapkan metode untuk melempar pengecualian (mis. InvalidOperationException
), Atau mengembalikan koleksi kosong? Tampaknya valid bagi saya:
- Anda tidak dapat menghasilkan kombinasi n item dari set item m di mana n> m jika Anda hanya diperbolehkan menggunakan setiap item sekali, sehingga operasi ini dapat dianggap mustahil, karenanya
InvalidOperationException
. - Himpunan kombinasi ukuran n yang dapat diproduksi dari item m ketika n> m adalah himpunan kosong; tidak ada kombinasi yang dapat diproduksi.
Argumen untuk set kosong
Kekhawatiran pertama saya adalah bahwa pengecualian mencegah chaining metode LINQ gaya idiomatik ketika Anda berurusan dengan dataset yang mungkin memiliki ukuran yang tidak diketahui. Dengan kata lain, Anda mungkin ingin melakukan sesuatu seperti ini:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
Jika set input Anda berukuran variabel, perilaku kode ini tidak dapat diprediksi. Jika .CombinationsOf()
melempar pengecualian ketika someInputSet
memiliki kurang dari 4 elemen, maka kode ini kadang - kadang akan gagal saat runtime tanpa beberapa pemeriksaan awal. Dalam contoh di atas pengecekan ini sepele, tetapi jika Anda menyebutnya setengah dari rantai yang lebih panjang dari LINQ maka ini mungkin membosankan. Jika mengembalikan set kosong, maka result
akan kosong, yang mungkin Anda senangi.
Argumen untuk pengecualian
Kekhawatiran kedua saya adalah bahwa mengembalikan set kosong mungkin menyembunyikan masalah - jika Anda memanggil metode ini di tengah-tengah rantai LINQ dan secara diam-diam mengembalikan set kosong, maka Anda dapat mengalami masalah beberapa langkah kemudian, atau menemukan diri Anda dengan yang kosong set hasil, dan mungkin tidak jelas bagaimana itu terjadi mengingat Anda pasti memiliki sesuatu di set input.
Apa yang Anda harapkan, dan apa argumen Anda untuk itu?