当您只想更改返回类型时,重载方法的最佳方式是

本文关键字:方法 重载 最佳 方式 只想 返回类型 | 更新日期: 2023-09-27 18:25:48

由于返回类型不能用于消除方法的歧义,当您只想更改返回类型时,重载方法最干净/最好的方法是什么?下面是一些示例代码;

public static string Get(string url, Guid id, bool logResponse = true, bool baseKey = false)
{
     Tuple<string, int> response = Get(url, id, true, logResponse, baseKey);
     if (response.Item2 > 399)
        return null;
     return response.Item1;
}

public static Tuple<string, int> Get(string url, Guid id, bool returnStatus, bool logResponse = true, bool baseKey = false)
{
    // leaving out lots of code in this method, you should be able to get the point without it
    int http_status;  
    string response = CallApi(url, key, "GET", out http_status);
    return new Tuple<string, int>(response, http_status);
}

上面的代码是有效的,但是我有一个额外的参数(returnStatus),它没有任何作用,只是为了让编译器能够区分这两种方法。有更好的方法吗?还是我只是在添加无用的参数?

当您只想更改返回类型时,重载方法的最佳方式是

更改方法名称,例如

string Get(string url, Guid id, bool logResponse)
Tuple<string, int> GetWithStatus(string url, Guid id, bool logResponse)

编程的主要目标不是告诉编译器区别,而是告诉将要阅读代码的开发人员区别。另一个选项是返回状态为out参数:

string Get(string url, Guid id, bool logResponse, out int status)

我不太喜欢out参数,但我更不喜欢元组——什么会告诉使用您方法的开发人员名称Item2?是状态、重试次数,还是响应长度?无论是方法名还是返回类型都不能说明它是什么

所以,即使是在第一个使用重命名方法的情况下,我也将返回类型更改为类似的类型

public class ServerResponse
{
    public string Content { get; set; }
    public HttpStatusCode Status { get; set; } // enum
    // use this in first method to check if request succeed
    public bool IsError
    {
       get { return (int)Status > 399; }
    }
}

我看到了三个选项。

  1. 返回object并在调用方法中消除歧义
  2. 将该方法设为泛型,然后使用反射检测所需的类型
  3. 重命名该方法

我会选择#3。把它们做成"GetOne"answers"GetTuple",你就做好了。

在我看来,关注点的分离,如果方法执行不同的功能,那么我们将分离为两个方法(不同的方法名称)。

但我会让其中一个是反射循环的私有方法,第一个方法会返回T的泛型类型,或者只返回T(我可能不想讨论重载,我想说的是上面的例子是返回字符串,但对于复杂的对象,可以有很多重载方法返回不同的类型,为什么不只返回T,让调用方获得T的对象)。

过载是好的,取决于要求。