4

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

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 )没有任何作用,它只是在那里,所以编译器可以区分这两种方法。有没有更好的方法来做到这一点,或者我只是坚持添加无用的参数?

4

3 回答 3

10

更改方法的名称,例如

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; }
    }
}
于 2013-08-01T22:49:05.393 回答
2

我看到三个选项。

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

我会选择#3。将它们设为“GetOne”和“GetTuple”,一切就绪。

于 2013-08-01T22:49:14.107 回答
0

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

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

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

于 2013-08-02T03:50:16.353 回答