Tworzę bibliotekę przeznaczoną do publicznego wydania. Zawiera różne metody działania na zestawach obiektów - generowanie, sprawdzanie, partycjonowanie i rzutowanie zbiorów na nowe formy. W razie IEnumerable
potrzeby jest to biblioteka klasy C # zawierająca włączone rozszerzenia w stylu LINQ , która ma zostać wydana jako pakiet NuGet.
Niektóre metody w tej bibliotece mogą mieć niezadowalające parametry wejściowe. Na przykład w metodach kombinatorycznych istnieje metoda generowania wszystkich zbiorów n elementów, które można zbudować ze zbioru źródłowego m elementów. Na przykład, biorąc pod uwagę zestaw:
1, 2, 3, 4, 5
a zapytanie o kombinacje 2 spowoduje:
1, 2
1, 3
1, 4
itd. ...
5, 3
5, 4
Teraz oczywiście można poprosić o coś, czego nie można zrobić, np. Dać mu zestaw 3 przedmiotów, a następnie poprosić o kombinację 4 przedmiotów, jednocześnie ustawiając opcję, która mówi, że można użyć każdego elementu tylko raz.
W tym scenariuszu każdy parametr jest indywidualnie ważny:
- Kolekcja źródłowa nie ma wartości NULL i zawiera elementy
- Żądany rozmiar kombinacji jest dodatnią liczbą całkowitą niezerową
- Żądany tryb (użyj każdego elementu tylko raz) jest prawidłowym wyborem
Jednak stan parametrów wziętych razem powoduje problemy.
Czy w tym scenariuszu można oczekiwać, że metoda zgłosi wyjątek (np. InvalidOperationException
) Lub zwróci pustą kolekcję? Oba wydają mi się ważne:
- Nie możesz wytworzyć kombinacji n przedmiotów z zestawu m przedmiotów, gdzie n> m, jeśli możesz użyć każdego elementu tylko raz, więc operację tę można uznać za niemożliwą
InvalidOperationException
. - Zestaw kombinacji rozmiaru n, który można wytworzyć z m elementów, gdy n> m jest pustym zestawem; nie można tworzyć kombinacji.
Argument za pustym zestawem
Moim pierwszym problemem jest to, że wyjątek zapobiega idiomatycznemu łączeniu metod w stylu LINQ, gdy mamy do czynienia z zestawami danych, które mogą mieć nieznany rozmiar. Innymi słowy, możesz chcieć zrobić coś takiego:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
Jeśli zestaw danych wejściowych ma zmienną wielkość, zachowanie tego kodu jest nieprzewidywalne. Jeśli .CombinationsOf()
zgłasza wyjątek, gdy someInputSet
ma mniej niż 4 elementy, ten kod czasami zawiedzie w czasie wykonywania bez wstępnego sprawdzenia. W powyższym przykładzie sprawdzanie jest trywialne, ale jeśli nazywasz to w połowie dłuższego łańcucha LINQ, może to być uciążliwe. Jeśli zwróci pusty zestaw, wówczas result
będzie pusty, z czego możesz być całkowicie zadowolony.
Argument za wyjątkiem
Moja druga obawa polega na tym, że zwrócenie pustego zestawu może ukryć problemy - jeśli wywołujesz tę metodę w połowie łańcucha LINQ i po cichu zwraca pusty zestaw, możesz mieć problemy kilka kroków później lub znaleźć się z pustym zestaw wyników i może nie być oczywiste, jak to się stało, biorąc pod uwagę, że zdecydowanie masz coś w zestawie wejściowym.
Czego byś się spodziewał i jaki jest twój argument za tym?