Предположим, что у меня есть две функции, которые похожи на это:
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?
Идеи я думал, но не люблю:
Я мог бы сделать что-то вроде этого:
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
в поток и вызовите переопределение с параметром потока.
Просто выполните рефакторинг doStuff и doStuff2 в отдельные методы.
Очевидно, что они делают «вещи», отличные от метода «somethingelsesfunction», так что в любом случае они должны быть отдельными методами. В идеале каждый метод должен иметь одну задачу.
Это даже поддерживаемый рефакторинг в Visual Studio - просто выделите код в «dostuff», щелкните правой кнопкой мыши и выберите Refactor-> Extract Method.
Я бы начал с извлечения методов DoStuff и DoStuff2 и их вызова из обеих функций.
Затем вы можете начать напугать, заключив блок в другой метод и передав ему функцию somethingelse для использования в этом методе, но это слишком далеко, imho. вы хотите, чтобы все было легко читать и изменять, а также не содержало повторений.
Используйте Действие
для настройки того, что функция делает в определенном месте.
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
}
В конце концов вы можете создать
public static void myFunction3(int a, int b, int c, Stream d, string e)
, который будет вызываться из function1 и function2 с d или e, установленными в ноль. Тогда function3 будет различать вызовы других функций (c, d). Это возможное решение, но для отчаявшихся :)