Я пытаюсь провести рефакторинг метода длиной в милю и думал, что если я вызову ReturnException вместо вызова return. Смотрите мой пример:
Текущий код длиной в милю выглядит следующим образом:
public void MyMileLongMethod()
{
//some logic
//some more logic
if (a == 10 && (b == "cool" || b == "super cool"))
{
//logic here
//more logic
//15 more lines of code.
return;
}
if (x && y || z==5)
{
//logic here
//more logic
//20 more lines of code.
return;
}
//more conditions like this that calls a return
// probable more logic here
}
И я хотел бы провести рефакторинг следующим образом:
public void MyRefactoredMethod()
{
try
{
DoLogic1(parameters);
ConditionOneMethod(parameters);
ConditionTwoMethod(parameters);
//more methods like above that throws a ReturnException
// probable more logic here
}
catch (ReturnException)
{
return;
}
}
void DoLogic1(parameters)
{
//some logic
//some more logic
}
void ConditionOneMethod(parameters)
{
if (a == 10 && (b == "cool" || b == "super cool"))
{
//logic here
//more logic
//15 more lines of code.
throw new ReturnException();
}
}
void ConditionTwoMethod(parameters)
{
if (x && y || z == 5)
{
//logic here
//more logic
//20 more lines of code.
throw new ReturnException();
}
}
Вопрос: Хорошая практика - генерировать исключение и перехватывать его в вызывающем методе, а затем вызывать return в catch? Если, так есть ли обычно используемое имя шаблона для этого?
Если это не очень хорошая практика, есть ли другой способ сделать это? Или мое решение ниже ответ?
Другое решение, которое у меня есть, это проверка условий во внешнем методе, а затем вызов метода, который выполняет логику, а затем вызов возврата, но мне кажется, что во внешнем методе много кода.