正是与我的讨论引发了这个问题,所以 Euro Micelli 已经知道我的答案了,但就是这样!:)
我认为 Linq to Objects 已经为这个问题提供了一个很好的答案。通过对一系列项目使用最简单的接口,它为如何实现该序列提供了最大的灵活性,这允许延迟生成,在不牺牲性能的情况下提高生产力(不是真正意义上的)。
确实,过早的抽象会产生成本——但主要是发现/发明新抽象的成本。但是,如果您已经为您提供了非常好的接口,那么如果您不利用它们,那就太疯狂了,而这正是通用集合接口为您提供的。
有些人会告诉你,公开一个类中的所有数据“更容易”,以防万一你需要访问它。同样,Euro 建议最好对容器IList<T>
(甚至是具体的类List<T>
)使用丰富的接口,然后再清理这些烂摊子。
但我认为,就像最好隐藏一个你不想访问的类的数据成员一样,让你以后可以轻松地修改该类的实现,所以你应该使用最简单的接口来引用一系列项目。在实践中,先暴露一些简单和基本的东西,然后再“放松”它,这比从松散的东西开始并努力强加秩序要容易得多。
所以假设IEnumerable<T>
会代表一个序列。然后在您需要Add
或Remove
项目(但仍不需要按索引查找)的情况下,使用IContainer<T>
继承IEnumerable<T>
,因此将与您的其他代码完美互操作。
这样一来(仅通过对某些代码的本地检查)就可以完全清楚地知道该代码将能够对数据做什么。
小程序需要较少的抽象,这是真的。但如果他们成功了,他们往往会成为大项目。如果他们首先使用简单的抽象,这会容易得多。