输入在技术上有效但不满意时,异常与空结果集
我正在开发要公开发布的库。它包含用于对对象集进行操作的各种方法-生成,检查,分区并将这些集投影到新形式。如果相关,它是一个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链的中途调用此方法,并且它悄悄地返回一个空集,那么稍后可能会遇到问题,或者发现自己为空结果集,鉴于您肯定在输入集中有某些内容,这种情况的发生可能并不明显。 您会期望什么,您对此有何看法?