Сокращение Повторения Кода: Вызывание функций с немного отличающимися подписями

Предположим, что у меня есть две функции, которые похожи на это:

public static void myFunction1(int a, int b, int c, string d)
{
    //dostuff
    someoneelsesfunction(c,d);
    //dostuff2
}

public static void myFunction2(int a, int b, int c, Stream d)
{
    //dostuff
    someoneelsesfunction(c,d);
    //dostuff2
}

Каков был бы хороший способ избежать повторенного dostuff?

Идеи я думал, но не люблю:

  1. Я мог сделать d объектом и броском в runtype на основе типа, но это, кажется мне, не идеально; это удаляет проверку типа, которая ранее происходила во время компиляции.
  2. Я мог также записать частный класс помощника, который берет объект, и запишите обе подписи как государственные функции.
  3. Я мог заменить dostuff и dostuff2 с делегатами или вызовами функции или чем-то.
7
задан Brian 31 March 2010 в 21:13
поделиться

5 ответов

Я мог бы сделать что-то вроде этого:

public static void myFunction1(int a, int b, int c, string d)
{
    //dostuff
    someoneelsesfunction(c, d);
    //dostuff2
}

public static void myFunction2(int a, int b, int c, Stream d)
{
    string str = d.ReadEntireString(); // no such method, but basically
        // whatever you need to do to read the string out of the stream
    myFunction1(a, b, c, str);      
}

... и изменить имя обеих функций на MyFunction (чтобы воспользоваться перегрузки, это то же самое, что делает somethingelsesfunction () .

ПРИМЕЧАНИЕ: это решение будет непрактичным, если строка, содержащаяся в Stream, огромна. Если это так, вы можете захотеть сделать это наоборот: прочтите строку d в поток и вызовите переопределение с параметром потока.

4
ответ дан 6 December 2019 в 15:20
поделиться

Просто выполните рефакторинг doStuff и doStuff2 в отдельные методы.

Очевидно, что они делают «вещи», отличные от метода «somethingelsesfunction», так что в любом случае они должны быть отдельными методами. В идеале каждый метод должен иметь одну задачу.

Это даже поддерживаемый рефакторинг в Visual Studio - просто выделите код в «dostuff», щелкните правой кнопкой мыши и выберите Refactor-> Extract Method.

6
ответ дан 6 December 2019 в 15:20
поделиться

Я бы начал с извлечения методов DoStuff и DoStuff2 и их вызова из обеих функций.

Затем вы можете начать напугать, заключив блок в другой метод и передав ему функцию somethingelse для использования в этом методе, но это слишком далеко, imho. вы хотите, чтобы все было легко читать и изменять, а также не содержало повторений.

0
ответ дан 6 December 2019 в 15:20
поделиться

Используйте Действие для настройки того, что функция делает в определенном месте.

public void myF1(int a, int b, int c, int d)
{
     internalF(a, b, { someelse1(c, d); }); 
}
public void myF2 (int a, int b, int c, Stream d)
{
     internalF(a, b, { someelse2(c, d); });
}
private void internalF (int a, int b, Action action)
{
    // dostuff
    action();
    // dostuff2
}
3
ответ дан 6 December 2019 в 15:20
поделиться

В конце концов вы можете создать

public static void myFunction3(int a, int b, int c, Stream d, string e)

, который будет вызываться из function1 и function2 с d или e, установленными в ноль. Тогда function3 будет различать вызовы других функций (c, d). Это возможное решение, но для отчаявшихся :)

1
ответ дан 6 December 2019 в 15:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: