当您只想更改返回类型时,重载方法的最佳方式是
本文关键字:方法 重载 最佳 方式 只想 返回类型 | 更新日期: 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; }
}
}
我看到了三个选项。
- 返回
object
并在调用方法中消除歧义 - 将该方法设为泛型,然后使用反射检测所需的类型
- 重命名该方法
我会选择#3。把它们做成"GetOne"answers"GetTuple",你就做好了。
在我看来,关注点的分离,如果方法执行不同的功能,那么我们将分离为两个方法(不同的方法名称)。
但我会让其中一个是反射循环的私有方法,第一个方法会返回T的泛型类型,或者只返回T(我可能不想讨论重载,我想说的是上面的例子是返回字符串,但对于复杂的对象,可以有很多重载方法返回不同的类型,为什么不只返回T,让调用方获得T的对象)。
过载是好的,取决于要求。