Question regarding return types with collections
在我的BL(将是公共API)中,我使用ICollection作为find方法中的返回类型,例如:
1 2 3 4 5 6 | public static ICollection<Customer> FindCustomers() { Collection<Customer> customers = DAL.GetCustomers(); return customers; } |
注意使用ICollection而不是Collection<>。
现在在我的GUI中,我需要将结果强制转换回集合,比如:
1 | Collection<Customer> customers = (Collection<Customer>)BL.FindCustomers(); |
这是因为我需要在返回的列表中使用一些collection<>特定的方法,而这是我不能用ICollection<>做的。
这是正确的用法吗?或者我应该简单地将返回类型从collection<>改为ICollection<>以避免这种转换吗?
其次,我没有使用IEnumerable,因为它比ICollection更通用,甚至没有像Count这样的简单属性。在这里,我真的不认为推广返回类型有什么意义。我错过重要的东西了吗?
您想要返回ICollection的唯一原因是为了实现松耦合和继承目的。如果您的方法只有一个版本(因为它是静态的),那么您将始终知道返回类型(集合),并且不需要使它成为ICollection。但是,如果在一系列类中使用,则可能会有一个返回和ICollection的虚拟或抽象方法,然后在子类实现中,可以返回集合或FunkyCollection或任何实现接口的对象,因此这会给您带来更多的灵活性,即说只能返回集合。但出于您的目的,您应该将返回类型集合改为ICollection,而不是ICollection,因为它是一个不会被重写的静态方法。此外,它还可以减少用户的困惑,因为他们不需要强制转换。
使用ICollection的关键是更通用,隐藏更多信息,这是一件好事。
但是,如果您需要将其转换回原处,它已经变得毫无意义了,您还可以返回更具功能性的集合<>
其他人已经给出了这么好的答案,但我只是想澄清,不,我不相信你所做的是理想的。这样做的原因是,如果稍后有人来修改/重构/重新实现您的BL以返回一些其他类型的
但是,您仍然可以选择从BL返回一个
祝你好运!< BR>- F!
如果您打算要求用户使用collection<>方法,那么您可能应该返回collection<>而不是ICollection。
或者,可以使用程序集内部的单独函数返回GUI所需的类型:
1 2 3 4 5 6 | internal static ICollection<Customer> FindCustomers() { Collection<Customer> customers = DAL.GetCustomers(); return customers; } |
这可能是因为集合实现了IList,而它有一些ICollection没有的额外方法,这对您来说已经足够了。你缺少什么方法?
返回ICollection的想法是这样您的方法耦合度就更少了。如果您以后想要构建一个列表,而不是一个集合,那么您就可以在不破坏客户机代码等的情况下完成它。
如果你只是用这个来获得一个集合(而不是一个ICollection),那么你可以改为Collection,因为你知道你会有一个不那么灵活的方法。但无论如何,雅格尼。
此外,如果您担心设计问题,我建议不要将此设置为静态的,以提高代码的可测试性。