在重载方法上返回不同的返回类型是否有最佳实践?例如,如果我的DAL中有一个Load方法,我要么加载一个项目或一堆项目。我知道我可以使用多种方法:
加载一个对象
MyBusinessObject LoadOne(int id)
{
}
加载多个对象
MyBusinessObject[] LoadMany(params int[] ids)
{
}
现在,我知道可以做的事情是重载一个方法并具有不同的返回类型。像这样:
MyBusinessObject Load(int id)
{
}
和
MyBusinessObject[] Load(params int[] ids)
{
}
虽然似乎没有什么可以阻止我这样做,并且从API的角度来看它保持整洁,这看起来是个好主意吗?我昨晚遇到它,部分我认为我不应该这样做,因为想要匹配重载方法的返回类型。
我也可以让Load(int id)方法返回一个只包含一个项目的集合。在我看来,这违反了最少惊喜的原则,但如果你期望返回一件物品,你应该退回该物品,你不应该返回包含单件物品的物品。
所以这是围绕这些想法的矛盾思想:
所以后两种想法比第一种想法更重要,但与此同时,第一种想法似乎是一种程序化的最佳实践。
是否有围绕这种做法的最佳做法?我有兴趣听听别人对这个问题的看法。
答案 0 :(得分:8)
我可能想要明确API并在名称中使用数字:
Customer LoadCustomer(int id) {...}
Customer[] LoadCustomers(params int[] id) {...}
实际上,params
在这里很少有用 - 你通常不会在编译时知道id。
答案 1 :(得分:3)
您可以查看现有的API。我们以LINQ为例,它具有返回许多实体的“Select”方法以及仅返回一个实体的“Single”方法。大多数现有的API有两种不同的方法,而不是重载的方法,我认为这是合乎逻辑的,更具可读性。
答案 2 :(得分:3)
可能有异常,但除非你有一个很好的理由返回不同的类型,否则函数及其重载应该返回相同的类型,这样你就不会让其他开发人员疯狂。
例如:
var a = MyFunc("Some text");
和
var a = MyFunc(1);
看起来他们应该将var解析为同一类型给我。在我偏离所有重载返回相同类型之前,我会确保我有一个非常可靠的理由返回不同类型。
答案 3 :(得分:2)
我倾向于按照你的“i>”思想列表中的第一点来说明“过度应该返回相同的类型”。
但是你可以用一些不同的场景重载“LoadMany”;
public Customer Load(int id)
{
// return just one customer
}
public List<Customer> LoadMany()
{
// return every single customer
}
public List<Customer> LoadMany(int statusFilter)
{
// return a filtered list of customers
}
public List<Customer> LoadMany(DateTime InitialContactFrom)
{
// return a filtered list of customers
}
public List<Customer> LoadMany(DateTime InitialContactFrom, DateTime InitialContactBefore)
{
// return a filtered list of customers
}
...显然可以添加您需要的任何组合,但最后,LoadMany返回一个列表,Load返回一个实体。
答案 4 :(得分:0)
我个人的想法是,从API用户的角度来看,后一种方法似乎更容易理解。