定义两个具有相同参数类型的方法

本文关键字:参数 类型 方法 两个 定义 | 更新日期: 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个方法:

  1. public static Department GetDepartmentByDepartmentName(string departmentName)
  2. 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);