题
我有一个类方法,它返回一个可以迭代的员工列表。返回列表的最佳方式是什么?通常我只返回一个 ArrayList。然而,据我了解,界面更适合这种类型的操作。哪个是最好使用的界面?另外,为什么返回接口而不是实现(例如 ArrayList 对象)更好?对我来说这似乎还有很多工作要做。
其他提示
@杰森
您也可以返回 IList<>,因为数组实际上实现了此接口。
做这样的事情的最好方法是返回,正如你所说,一个列表,最好使用泛型,所以它将是列表<Employee
>.
返回 List 而不是 ArrayList 意味着,如果稍后您决定使用 LinkedList,则除了创建对象的起始位置(即调用“new”)之外,无需更改任何代码。数组列表())”。
如果您所做的只是迭代列表,则可以定义一个将列表返回为 IEnumerable(对于 .NET)的方法。
通过返回只提供您需要的功能的接口,如果将来出现一些新的集合类型,它更好/更快/更适合您的应用程序,只要它仍然实现 IEnumerable,您就可以完全重写您的方法,使用它内部的新类型,而不更改任何调用它的代码。
有什么理由需要订购该系列吗?为什么不简单地返回一个 IEnumerable<Employee>
?这给出了所需的最低限度 - 如果您以后想要某种其他形式的存储,例如袋子、套装或树或诸如此类的东西,您的合同将保持不变。
我不同意返回接口更好的前提。我的原因是您希望最大化给定代码块所公开的有用性。
考虑到这一点,接口可以接受一个项目作为参数。如果函数参数调用数组或 ArrayList,那么这是您可以传递给它的唯一内容。如果函数参数调用 IEnumerable,它将接受其中一个,以及许多其他对象。更有用的是
然而,返回值的作用相反。当您返回 IEnumerable 时,您唯一能做的就是枚举它。如果您有一个方便的列表并返回该列表,那么调用您的函数的代码也可以轻松地执行许多其他操作,例如获取计数。
不过,我与那些建议您远离 ArrayList 的人站在一起。泛型是 好多了。
接口是实现和实现的用户之间的契约。
通过使用接口,您可以根据需要对实现进行更改,只要它维护用户的契约即可。
它还允许多个实现使用相同的接口,以便用户可以重用与该接口交互的代码。
你没有说你在谈论什么语言,但在 .NETish 中,返回 IList 并不比返回 List 甚至 ArrayList 更重要,尽管仅仅提到那个过时的类就让我认为你是不是在谈论.NET。
接口本质上是类具有某些方法或属性的契约;对接口进行编程而不是直接实现可以实现更加动态和可管理的代码,因为只要“合同”仍然存在,您就可以完全交换实现。
在您描述的情况下,传递接口不会给您带来特别的优势,如果是我,我会传递带有泛型类型的 ArrayList,或者传递 Array 本身:列表.toArray()
实际上,如果这是一个框架,你不应该返回一个 List,至少不是没有考虑一下,推荐使用的类是 Collection。List 类具有一些性能改进,但代价是服务器可扩展性问题。这实际上是 FXCop 的一条规则。
你有这样的理由 本文
您的方法的返回类型应该是 IList<Employee>
.
这意味着你的方法的调用者可以使用任何 IList
提供但不能使用特定的东西 ArrayList
. 。然后如果你在某个时刻感觉 LinkedList
或者 YourCustomSuperDuperList
提供更好的性能或其他优势,您可以在您的方法中安全地使用它,而不是破坏它的调用者。
大致就是接口101。;-)