我应该在重载方法上使用不同的返回类型吗?

时间:2009-10-11 19:15:18

标签: c# .net

在重载方法上返回不同的返回类型是否有最佳实践?例如,如果我的DAL中有一个Load方法,我要么加载一个项目或一堆项目。我知道我可以使用多种方法:

加载一个对象

MyBusinessObject LoadOne(int id)
{
}

加载多个对象

MyBusinessObject[] LoadMany(params int[] ids)
{
}

现在,我知道可以做的事情是重载一个方法并具有不同的返回类型。像这样:

MyBusinessObject Load(int id)
{
}

MyBusinessObject[] Load(params int[] ids)
{
}

虽然似乎没有什么可以阻止我这样做,并且从API的角度来看它保持整洁,这看起来是个好主意吗?我昨晚遇到它,部分我认为我不应该这样做,因为想要匹配重载方法的返回类型。

我也可以让Load(int id)方法返回一个只包含一个项目的集合。在我看来,这违反了最少惊喜的原则,但如果你期望返回一件物品,你应该退回该物品,你不应该返回包含单件物品的物品。

所以这是围绕这些想法的矛盾思想:

  • 重载方法应该都返回相同的类型。
  • 如果方法做同样的事情,不要给它们一堆不同的名称,重载相同的方法名称。从API用户的角度来看,它使事情更简单,他们不必遍历一堆不同的方法,这些方法基本上都做同样的事情,但使用不同的参数。
  • 返回方法最明显的类型,即如果用户可能期望收集项目,则返回项目集合,如果他们可能期望单个项目,则返回单个项目。

所以后两种想法比第一种想法更重要,但与此同时,第一种想法似乎是一种程序化的最佳实践。

是否有围绕这种做法的最佳做法?我有兴趣听听别人对这个问题的看法。

5 个答案:

答案 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用户的角度来看,后一种方法似乎更容易理解。