Определите два метода с одинаковым типом параметра - PullRequest
9 голосов
/ 28 июля 2011

Сегодня я столкнулся со сценарием, в котором мне нужно создать метод, который разделяет тот же 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
    }

Какова наилучшая практика для этого случая?Я вижу, как мой код может работать, но ни один из них не удовлетворил меня

Ответы [ 5 ]

33 голосов
/ 28 июля 2011

Поддержание читабельности - это точно , почему вы должны переименовать его:

Department GetDepartmentByName(...)

Department GetDepartmentByEmployeeID(...)

Теперь, когда вы вызываете метод, абсолютно очевидно , какой вы имеете в виду.Это очень не случай, когда вы вместо этого перегружаете метод.

Я стал все более и более неохотно перегружаться с течением времени - довольно много тонких проблем ,и читаемость очень часто снижается.

5 голосов
/ 28 июля 2011

Вы можете обновить сигнатуры методов и одновременно сделать код более читабельным, выполнив что-то вроде следующего.

public static GetDepartmentByName( string departmentName )

public static GetDepartmentByEmployeeId( string employeeId )

Лично я чувствую, что добавление многословия в код помогает другим, кто придет позже, понять, что происходит. Это также помогает легче читать ваши методы.

4 голосов
/ 28 июля 2011

Определить 2 метода:

  1. public static Department GetDepartmentByDepartmentName(string departmentName)
  2. public static Department GetDepartmentByEmployeeID(string employeeID)
0 голосов
/ 15 ноября 2018

Немного поздно, но возможно, у меня сегодня был точно такой же сценарий (перегрузка конструктора, поэтому имя изменить нельзя).Вот как я это сделал, небольшой взлом, но он позволяет мне иметь все мои предикаты 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);
0 голосов
/ 28 июля 2011

Другой вариант - делегировать другим методам, если вы можете как-то различить идентификатор сотрудника и название отдела, изучив аргумент.

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% по пункту.

...