给出这个例子:
Interface CustomersDao
Function Get(ByVal Id As Integer) As Customer
Function Get(ByVal Filter As Filter) As IList(Of Customer)
End Interface
Public Sub Main()
Dim Customer As Customer = CustomersDao.Get(4)
Dim Filter As New CustomersDao.Filter
Filter.Category = 2
Dim Customers As IList(Of Customer) = CustomersDao.Get(Filter)
End Sub
在同一方法中返回不同类型是不好的做法?
答案 0 :(得分:6)
我建议拨打第二个GetAll
。
目前,第二种方法返回集合并不明显 您应该努力确保您的课程尽可能明显,并且不会包含任何意外的惊喜。
答案 1 :(得分:4)
不,我会说完全没问题。
答案 2 :(得分:3)
在您的示例中,API有意义并且看起来很直观。特别是因为您将函数参数Id和Filter命名为IMO,分别表示单个值结果和集合。缺点是在智能感知场景中你必须检查每个重载以查看它的作用,而不是仅仅看到在建议列表中调用的正确方法。例如。 GetSingle(int id)
与GetAll()
对比GetSubset(string filter)
我可以想象重载和返回不同类型的情况很快就会变得非常混乱。特别是如果你开始引入黑客来解决已建立的API使用问题。
答案 3 :(得分:3)
是的,我认为这是一种不良做法。
尝试在.NET Framework中找到重载,返回不同的类型,我想不到一个。
.NET Framework中有一些方法DateTime.Subtract()但是它们是例外而不是规则,只有意图完全明显的情况。
答案 4 :(得分:0)
我建议这不是最佳实践,因为如果变量声明不能立即可见,它就不会产生直观,可读的代码。我通常会使用GetById和GetForFilter,GetAll等来更好地描述正在发生的动作。
答案 5 :(得分:0)
返回接口是合适的,因为(声音实践允许)接口将不同的类链接到类似的问题域并保证一组一致的方法。
然而,不同的类型需要进行气味检查,因为它更容易记住可用于获取数据的不同args,而不是记住返回的各种类型或者必须分支自己的代码以适应这些类型,即使你记得。
这里没有人提供的缺失选择是重载两个作为返回列表,即使id似乎只是返回单项列表是愚蠢的。它对jQuery很有用,jQuery是一个相当于大量重载函数的JavaScript。
一致的回报意味着我只需要记住你的API为我做的事情而不是我必须做的事情。