Ich entwickle eine Bibliothek für die Veröffentlichung. Es enthält verschiedene Methoden zum Bearbeiten von Objektgruppen - Erzeugen, Untersuchen, Partitionieren und Projizieren der Gruppen in neue Formen. Für den Fall , es relevant ist, ist es eine C # -Klasse Bibliothek mit LINQ-style - Erweiterungen auf IEnumerable
, als NuGet Paket freigegeben werden.
Bei einigen Methoden in dieser Bibliothek können unbefriedigende Eingabeparameter angegeben werden. Beispielsweise gibt es in den kombinatorischen Methoden eine Methode zum Generieren aller Mengen von n Elementen, die aus einer Quellmenge von m Elementen erstellt werden können. Zum Beispiel angesichts des Satzes:
1, 2, 3, 4, 5
und nach Kombinationen von 2 zu fragen, würde ergeben:
1, 2
1, 3
1, 4
etc ...
5, 3
5, 4
Jetzt ist es natürlich möglich, nach etwas zu fragen, das nicht erledigt werden kann, z. B. 3 Elemente zuzuweisen und dann nach Kombinationen von 4 Elementen zu fragen, während die Option festgelegt wird, die besagt, dass jedes Element nur einmal verwendet werden kann.
In diesem Szenario ist jeder Parameter einzeln gültig:
- Die Quellensammlung ist nicht null und enthält Elemente
- Die angeforderte Größe von Kombinationen ist eine positive Ganzzahl ungleich Null
- Der angeforderte Modus (benutze jeden Gegenstand nur einmal) ist eine gültige Wahl
Der Zustand der Parameter zusammen verursacht jedoch Probleme.
Würden Sie in diesem Szenario erwarten, dass die Methode eine Ausnahme auslöst (z. B. InvalidOperationException
) oder eine leere Auflistung zurückgibt? Beides scheint mir gültig zu sein:
- Sie können keine Kombinationen von n Elementen aus einer Menge von m Elementen erzeugen , wobei n> m ist, wenn Sie jedes Element nur einmal verwenden dürfen, sodass diese Operation als unmöglich angesehen werden kann
InvalidOperationException
. - Die Menge von Kombinationen der Größe n , die aus m Elementen erzeugt werden können, wenn n> m eine leere Menge ist; Es können keine Kombinationen hergestellt werden.
Das Argument für eine leere Menge
Meine erste Sorge ist, dass eine Ausnahme die idiomatische Verkettung von Methoden im LINQ-Stil verhindert, wenn Sie mit Datensätzen arbeiten, deren Größe möglicherweise unbekannt ist. Mit anderen Worten, möchten Sie vielleicht so etwas tun:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
Wenn Ihr Eingabesatz eine variable Größe hat, ist das Verhalten dieses Codes nicht vorhersehbar. Wenn .CombinationsOf()
bei someInputSet
weniger als 4 Elementen eine Ausnahme ausgelöst wird, schlägt dieser Code manchmal zur Laufzeit ohne vorherige Überprüfung fehl. Im obigen Beispiel ist diese Überprüfung trivial, aber wenn Sie sie auf halber Strecke einer längeren LINQ-Kette aufrufen, wird dies möglicherweise mühsam. Wenn ein leerer Satz zurückgegeben wird, ist result
dieser leer, womit Sie möglicherweise vollkommen zufrieden sind.
Das Argument für eine Ausnahme
Meine zweite Sorge ist, dass das Zurückgeben einer leeren Menge Probleme verbergen könnte. Wenn Sie diese Methode in der Mitte einer LINQ-Kette aufrufen und eine leere Menge stillschweigend zurückgeben, kann es sein, dass Sie einige Schritte später auf Probleme stoßen oder eine leere finden Ergebnismenge, und es kann nicht offensichtlich sein, wie das passiert ist, vorausgesetzt, Sie hatten definitiv etwas in der Eingabemenge.
Was würden Sie erwarten und was ist Ihr Argument dafür?