私は公開リリースを目的としたライブラリを開発しています。オブジェクトのセットを操作するためのさまざまなメソッドが含まれています-セットを生成、検査、パーティション分割、新しいフォームに投影します。関連する場合IEnumerable
は、NuGetパッケージとしてリリースされるLINQスタイルの拡張を含むC#クラスライブラリです。
このライブラリの一部のメソッドには、満たされない入力パラメーターを指定できます。たとえば、組み合わせメソッドには、m個のアイテムのソースセットから構築できるn個のアイテムのすべてのセットを生成するメソッドがあります。たとえば、次のセットを考えます:
1、2、3、4、5
2の組み合わせを要求すると、次の結果が得られます。
1、2
1、3
1、4
等...
5、3
5、4
現在、3つのアイテムのセットを提供し、各アイテムを1回しか使用できないというオプションを設定しながら、4つのアイテムの組み合わせを要求するなど、実行できないことを要求することは明らかに可能です。
このシナリオでは、各パラメーターは個別に有効です。
- ソースコレクションはnullではなく、アイテムが含まれています
- 要求された組み合わせのサイズは、ゼロ以外の正の整数です
- 要求されたモード(各アイテムを1回のみ使用)は有効な選択です
ただし、パラメーターの状態を一緒にすると問題が発生します。
このシナリオでは、メソッドが例外をスローすることを期待しますか(例:)InvalidOperationException
、または空のコレクションを返しますか?どちらも私にとって有効なようです:
- あなたは、の組み合わせを生成することができないn個のセットから項目をm個の項目N> M君はそれゆえ、一度だけ、各アイテムの使用を許可しているので、この操作は不可能と考えることができる場合
InvalidOperationException
。 - n> mが空のセットである場合にm個のアイテムから生成できるサイズnの組み合わせのセット。組み合わせは作成できません。
空のセットの引数
私の最初の懸念は、サイズが不明なデータセットを処理する場合、例外が慣用的なLINQスタイルのメソッドのチェーンを妨げることです。言い換えれば、あなたはこのようなことをしたいと思うかもしれません:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
入力セットのサイズが可変の場合、このコードの動作は予測できません。場合は.CombinationsOf()
、例外をスローしたときsomeInputSet
よりも少ない4つの要素を持っている場合、このコードがします時々、いくつかの事前チェックせずに、実行時に失敗します。上記の例では、このチェックは簡単ですが、より長いLINQチェーンの途中で呼び出す場合、これは面倒になります。それが空のセットを返す場合、空になりますresult
。
例外の引数
私の2番目の懸念は、空のセットを返すと問題が隠れる可能性があることです-LINQのチェーンの途中でこのメソッドを呼び出して静かに空のセットを返す場合、後でいくつかの手順で問題が発生するか、空の結果セット。入力セットに何かが確実に含まれていた場合、それがどのように発生したかは明らかではないかもしれません。
あなたは何を期待しますか、それに対するあなたの議論は何ですか?