我目前正在编写一个简单的数据访问层,我想知道我应该向其他层公开哪种类型.
我将在内部实现数据作为列表<>,但我记得在不需要的情况下阅读有关不向消费者公开List类型的内容.
public ListGetAllUsers() // non C# users: that means List of User :)
你知道为什么(谷歌没有帮助)?你经常为那种东西揭露什么?IList的?IEnumerable的?
通常最好暴露用户仍可以有意义地使用的功能最少的接口.如果用户只需要一些可枚举的数据,请返回IEnumerable
.如果这还不够,因为用户需要能够修改列表(注意!通常不应该这样),返回一个IList
.
Joel在他的评论中提出了一个有效的问题:为什么确实暴露了功能最少的界面,而不是授予用户最大的权力?(转述)
这背后的想法是返回数据的方法可能不希望用户修改其内容:类的另一个方法可能仍然期望在返回对它的引用之后该列表为非空.想象一下,用户从列表中删除所有数据.另一种方法现在必须另外检查ele可能是不必要的.
更重要的是,这通过返回类型公开了部分内部实现.如果我将来需要更改实现以便它不再使用IList
容器,我就会遇到一个问题:我要么需要更改方法契约,要么引入一个破坏性的更改.或者我需要将数据复制到列表容器中.
作为一个例子,假设一个有效的实现使用Dictionary并且只返回Values
未实现的集合IList
.