如何
很多倍,而接受枚举类型编写函数我面对这样的困惑决定API签名。哪个API暴露会从以下选项中更好:如何
public void Resolve(Func<bool>[] howtos)
public void Resolve(IEnumerable<Func<bool>> howtos)
public void Resolve(List<Func<bool>> howtos)
我通常是决定基于以下: 如果输入需要通过添加或删除项目被修改,随后使用List使用别的IEnumerable的。不确定数组选项。
是需要考虑的,而在API决定被曝光有其他点?是否有任何经验法则清楚地确定了哪些情况下应优先于另一方?
感谢
你应该总是接受限制最少的参数类型。
这意味着IEnumerable<T>
,ICollection<T>
或IList<T>
。
这种方式,客户端可以*地通过任何种类的实现,如阵列,HashSet<T>
,或ReadOnlyCollection<T>
。
具体而言,您应该采取IEnumerable<T>
如果你只需要遍历数据,ICollection<T>
如果你也想添加或删除项目,或者如果您需要了解大小,IList<T>
如果你需要随机访问(索引)。
你的方法听起来不错。我唯一会改变的是IList<T>
而不是List<T>
。允许用户例如验证您添加到列表中的任何内容。
为我作出这个决定的主要因素是
什么是真正解决与集合在做什么?
如果解决方案没有以任何方式改变集合,那么我绝对会更喜欢IEnumerable<Func<bool>>
签名。它允许使用最多的用例,并最准确地表达API的意图。我认为任何采取更具体的类型如List<T>
的人都打算修改传入的集合。看到IEnumerable<T>
给了我一点保证,收集只是被枚举。
如果解决在变异集合然后我宁愿List<T>
签名,表明突变确实是可能的。我们可能会通过取回IEnumerable<T>
来创建流畅的界面。这将取决于Resolve方法的类型。当我选择一个时很难概括。
谢谢。很好的解释。 +1 – *user 2011-03-03 00:31:28
ReSharper的通常会告诉你,当你没有限制最少的类型。 – 2011-03-02 18:06:16
@Yuriy:至于代码分析。 – SLaks 2011-03-02 18:06:43