Sto sviluppando una libreria destinata al rilascio pubblico. Contiene vari metodi per operare su insiemi di oggetti: generare, ispezionare, partizionare e proiettare gli insiemi in nuove forme. Nel caso sia pertinente, è una libreria di classe C # contenente estensioni in stile LINQ su IEnumerable
, da rilasciare come pacchetto NuGet.
Ad alcuni dei metodi in questa libreria possono essere forniti parametri di input non soddisfacenti. Ad esempio, nei metodi combinatori, esiste un metodo per generare tutti gli insiemi di n elementi che possono essere costruiti da un insieme di origine di m elementi. Ad esempio, dato il set:
1, 2, 3, 4, 5
e chiedere combinazioni di 2 produrrebbe:
1, 2
1, 3
1, 4
ecc ...
5, 3
5, 4
Ora, ovviamente, è possibile chiedere qualcosa che non può essere fatto, come dargli un set di 3 elementi e quindi chiedere combinazioni di 4 elementi mentre si imposta l'opzione che dice che può usare ogni oggetto solo una volta.
In questo scenario, ogni parametro è individualmente valido:
- La raccolta di origine non è nulla e contiene elementi
- La dimensione richiesta delle combinazioni è un numero intero diverso da zero
- La modalità richiesta (usa ogni elemento una sola volta) è una scelta valida
Tuttavia, lo stato dei parametri quando presi insieme causa problemi.
In questo scenario, ti aspetteresti che il metodo generi un'eccezione (ad es. InvalidOperationException
) O restituisca una raccolta vuota? O mi sembra valido:
- Non è possibile produrre combinazioni di n elementi da un insieme di m elementi in cui n> m se è consentito utilizzare ogni articolo una sola volta, quindi questa operazione può essere considerata impossibile, quindi
InvalidOperationException
. - L'insieme di combinazioni di dimensione n che possono essere prodotte da m articoli quando n> m è un insieme vuoto; nessuna combinazione può essere prodotta.
L'argomento per un set vuoto
La mia prima preoccupazione è che un'eccezione impedisce il concatenamento idiomatico di metodi in stile LINQ quando si ha a che fare con set di dati che potrebbero avere dimensioni sconosciute. In altre parole, potresti voler fare qualcosa del genere:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
Se il set di input ha dimensioni variabili, il comportamento di questo codice è imprevedibile. Se .CombinationsOf()
genera un'eccezione quando someInputSet
ha meno di 4 elementi, questo codice a volte fallirà in fase di esecuzione senza alcuni controlli preliminari. Nell'esempio sopra questo controllo è banale, ma se lo chiami a metà di una catena più lunga di LINQ, questo potrebbe diventare noioso. Se restituisce un set vuoto, result
sarà vuoto, di cui potresti essere perfettamente soddisfatto.
L'argomento per un'eccezione
La mia seconda preoccupazione è che la restituzione di un set vuoto potrebbe nascondere problemi: se stai chiamando questo metodo a metà di una catena di LINQ e restituisce silenziosamente un set vuoto, potresti riscontrare problemi alcuni passaggi in seguito, o ritrovarti con un vuoto set di risultati, e potrebbe non essere ovvio come sia accaduto dato che hai sicuramente avuto qualcosa nel set di input.
Cosa ti aspetteresti e qual è il tuo argomento?