定义两个具有相同参数类型的方法
本文关键字:参数 类型 方法 两个 定义 | 更新日期: 2023-09-27 18:03:54
今天我遇到了一个场景,我必须创建一个方法,与现有的一个共享相同的name, params count and params types
,像这样:
public static Department GetDepartment(string departmentName)
{
//LOGIC
}
public static Department GetDepartment(string employeeID)
{
//LOGIC
}
乍一看,我只是说为什么不给它起一个不同的名字,把事情做好,但我不能!我确实想保持我正在编写的代码的可读性,我希望它是overloaded
到第一个,
所以我说,为什么不添加一个假参数,只是为了从编译器的角度解决这个问题。
public static Department GetDepartment(string employeeID, object fakePassWtEver)
{
//LOGIC
}
这种情况下的最佳实践是什么?我看到了所有的方法可以让我的代码运行,但没有一个让我满意
保持可读性正是你应该重命名的原因:
Department GetDepartmentByName(...)
Department GetDepartmentByEmployeeID(...)
现在无论何时调用该方法,绝对明显你指的是哪个。如果你重载这个方法,那就不是的情况了。
随着时间的推移,我越来越不愿意超载了——这有很多微妙的问题,而且可读性经常会下降。
你可以更新你的方法签名,使你的代码更易读,同时做如下的事情:
public static GetDepartmentByName( string departmentName )
public static GetDepartmentByEmployeeId( string employeeId )
我个人认为,在代码中添加冗长有助于其他人稍后理解发生了什么。
定义2个方法:
-
public static Department GetDepartmentByDepartmentName(string departmentName)
-
public static Department GetDepartmentByEmployeeID(string employeeID)
如果您可以通过检查参数来区分员工ID和部门名称,则可以选择委托给其他方法。
public static Department GetDepartment(string employeeIdOrDepartmentName) {
if (LooksLikeEmployeeID(employeeIdOrDepartmentName))
return GetDepartmentByEmployeeID(employeeIdOrDepartmentName);
else
return GetDepartmentByDepartmentName(employeeIdOrDepartmentName);
}
private static Department GetDepartmentByEmployeeID(string employeeId) {
/* ... */
}
private static Department GetDepartmentByDepartmentName(string departmentName) {
/* ... */
}
你应该只在你绝对不能添加其他方法来明确的情况下这样做——其他答案是100%正确的。
有点晚,但这是可能的,我今天有完全相同的场景(构造函数重载,因此不能更改名称)。这是我是怎么做的,小技巧,但它让我有我所有的LINQ谓词相关在同一个地方:
public BusinessStructureFilterSpecification(int responsibilityTypeId, bool dummy1 = true) : base(x => x.ResponsibleGroups.Any(x1 => x1.ResponsibilityTypeId == responsibilityTypeId))
{
AddIncludes();
}
public BusinessStructureFilterSpecification(int userId, string dummy2 = "") : base(x => x.ResponsibleUsers.Any(x1 => x1.UserId == userId))
{
AddIncludes();
}
现在的技巧是使用参数名来调用它们,像这样:
if (responsibiltyTypeId.HasValue && !userId.HasValue)
spec = new BusinessStructureFilterSpecification(responsibilityTypeId: responsibiltyTypeId.Value);
if (!responsibiltyTypeId.HasValue && userId.HasValue)
spec = new BusinessStructureFilterSpecification(userId: userId.Value);