我正在开发要公开发布的库。它包含用于对对象集进行操作的各种方法-生成,检查,分区并将这些集投影到新形式。如果相关,它是一个C#类库,其中包含LINQ样式的扩展IEnumerable
,将作为NuGet软件包发布。
该库中的某些方法可能会被赋予无法满足的输入参数。例如,在组合方法中,存在一种生成可以从m个项目的源集合构造的n个项目的所有集合的方法。例如,给定集合:
1,2,3,4,5
并要求2的组合将产生:
1,2
1,3
1,4
等...
5,3
5,4
现在,显然可以要求做一些无法完成的事情,例如给它提供3个项目的集合,然后要求4个项目的组合,同时设置说只能使用每个项目一次的选项。
在这种情况下,每个参数都是单独有效的:
- 源集合不为null,并且包含项
- 要求的组合大小为正非零整数
- 请求的模式(仅使用每个项目一次)是有效选择
但是,将这些参数的状态放在一起时会引起问题。
在这种情况下,您是否希望该方法引发异常(例如InvalidOperationException
)或返回空集合?在我看来,任何一种都有效:
- 如果只允许每个项目使用一次,则不能从m个项目的集合(其中n> m个)中产生n个项目的组合,因此该操作被认为是不可能的。
InvalidOperationException
- 当n> m时可以从m个项目中生成的大小为n的组合的集合为空集;无法产生任何组合。
空集的参数
我首先担心的是,当您处理大小可能未知的数据集时,异常会阻止惯用的LINQ样式方法链接。换句话说,您可能想要执行以下操作:
var result = someInputSet
.CombinationsOf(4, CombinationsGenerationMode.Distinct)
.Select(combo => /* do some operation to a combination */)
.ToList();
如果您的输入集大小可变,则此代码的行为是不可预测的。如果少于4个元素.CombinationsOf()
时引发异常someInputSet
,则此代码有时会在运行时失败,而无需进行一些预检查。在上面的示例中,此检查是微不足道的,但是如果您在较长的LINQ链中途调用它,则可能会变得乏味。如果它返回一个空集,result
则将为空,您可能会很满意。
例外的论点
我的第二个担心是,返回一个空集可能会隐藏问题-如果您在LINQ链的中途调用此方法,并且它悄悄地返回一个空集,那么稍后可能会遇到问题,或者发现自己为空结果集,鉴于您肯定在输入集中有某些内容,这种情况的发生可能并不明显。
您会期望什么,您对此有何看法?