代码之家  ›  专栏  ›  技术社区  ›  BenAlabaster

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

  •  5
  • BenAlabaster  · 技术社区  · 16 年前

    对于重载方法返回不同的返回类型,有什么最佳实践吗?例如,如果我的DAL中有一个Load方法,我要么想加载单个项,要么想加载一组项。我知道我可以使用多种方法:

    加载一个对象

    MyBusinessObject LoadOne(int id)
    {
    }
    

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

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

    MyBusinessObject Load(int id)
    {
    }
    

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

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

    我还可以让Load(intid)方法返回一个只包含一个项的集合。在我看来,这违反了最小惊喜原则,尽管如果您希望返回一个项目,那么您应该返回该项目,而不应该返回包含单个项目的列表。

    因此,以下是我围绕这些观点的相互矛盾的想法:

    • 重载的方法都应该返回相同的类型。
    • 如果方法做相同的事情,不要给它们一堆不同的名称,重载相同的方法名称。从API用户的角度来看,它使事情变得更简单,他们不必遍历一堆不同的方法,这些方法本质上都做相同的事情,但参数不同。

    因此,后两种想法有点超过了第一种,但同时,第一种想法似乎是某种编程的最佳实践。

    5 回复  |  直到 16 年前
        1
  •  8
  •   Marc Gravell    16 年前

    我可能会想让API显式化,并在名称中使用复数:

    Customer LoadCustomer(int id) {...}
    Customer[] LoadCustomers(params int[] id) {...}
    

    params

        2
  •  3
  •   Restuta    16 年前

        3
  •  3
  •   overstood    16 年前

    可能会有例外,但除非您有很好的理由返回不同的类型,否则函数及其重载应该返回相同的类型,这样您就不会让其他开发人员发疯。

    var a = MyFunc("Some text");
    

    和

    var a = MyFunc(1);
    

        4
  •  2
  •   Stuart Helwig    16 年前

    我倾向于遵循你清单中的第一点 “关于这个想法的想法” 也就是说“重载应该返回相同的类型”。

    但是您可以使用一些不同的场景重载“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返回一个实体。

        5
  •  0
  •   erelender    16 年前

    我个人的想法是,从API用户的角度来看,后一种方法似乎更容易理解。