Я розробляю бібліотеку, призначену для публічного випуску. Він містить різні методи роботи з наборами об'єктів - генерування, перевірка, розділення та проектування наборів у нові форми. У випадку, якщо це доречно, це бібліотека класів C #, що містить розширення у стилі LINQ IEnumerable
, випускається як пакет NuGet.
Деяким із методів цієї бібліотеки можуть бути задані незадовільні вхідні параметри. Наприклад, у комбінаторних методах є метод для генерації всіх наборів з n елементів, які можна побудувати з вихідного набору m елементів. Наприклад, з урахуванням набору:
1, 2, 3, 4, 5
а запитання про комбінації 2 призведе до:
1, 2
1, 3
1, 4
тощо ...
5, 3
5, 4
Тепер, очевидно, можна попросити щось, чого неможливо зробити, як-от надати йому набір з 3-х предметів, а потім попросити комбінації 4-х елементів, встановивши параметр, який говорить, що він може використовувати кожен елемент лише один раз.
У цьому сценарії кожен параметр діє індивідуально :
- Колекція джерела не є нульовою і містить елементи
- Запитаний розмір комбінацій - це додатне ненулеве ціле число
- Запитаний режим (використовуйте кожен елемент лише один раз) є правильним вибором
Однак стан параметрів при їх узятті створює проблеми.
У цьому сценарії ви очікуєте, що метод викине виняток (наприклад InvalidOperationException
) або поверне порожню колекцію? Для мене це видається дійсним:
- Ви не можете створити комбінації n елементів із набору m елементів, де n> m, якщо вам дозволяється використовувати кожен елемент лише один раз, тому цю операцію можна вважати неможливою
InvalidOperationException
. - Набір комбінацій розміру n, які можуть бути створені з m елементів, коли n> m - порожній набір; ніяких комбінацій не може бути вироблено.
Аргумент для порожнього набору
Перше моє занепокоєння полягає в тому, що виняток заважає ідіоматичному ланцюжковій схемі в стилі LINQ, коли ви маєте справу з наборами даних, які можуть мати невідомий розмір. Іншими словами, ви можете зробити щось подібне:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
Якщо ваш набір змінних розмірів, поведінка цього коду непередбачувана. Якщо .CombinationsOf()
викид має виняток, коли в someInputSet
ньому менше 4 елементів, то цей код іноді виходить з ладу під час виконання без попередньої перевірки. У наведеному вище прикладі ця перевірка є тривіальною, але якщо ви називаєте її на півдорозі довшою ланцюжком LINQ, це може стати втомливим. Якщо він поверне порожній набір, то result
він буде порожнім, чим ви можете бути цілком задоволені.
Аргумент на виняток
Моє друге занепокоєння полягає в тому, що повернення порожнього набору може приховати проблеми - якщо ви викликаєте цей метод на півдорозі ланцюжка LINQ і він непомітно повертає порожній набір, то ви можете наткнутися на проблеми кілька кроків пізніше або опинитися з порожнім набір результатів, і це може бути не очевидно, як це сталося, враховуючи, що ви напевно щось мали у вхідному наборі.
Що б ви очікували, і який ваш аргумент для цього?