Бросая исключение вместо того, чтобы иметь дело с возвратами - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь провести рефакторинг метода длиной в милю и думал, что если я вызову 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? Если, так есть ли обычно используемое имя шаблона для этого? Если это не очень хорошая практика, есть ли другой способ сделать это? Или мое решение ниже ответ?

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

1 Ответ

0 голосов
/ 10 января 2019

Я бы за использование такого варианта:

private void MyRefactoredMethod(...) {
    ...
    if (...)
        return; // was "continue;"
    ...
    if (!ConditionOneMethod(...))
        return;
    ...
}

private boolean ConditionOneMethod(...) {
    ...
    if (...)
        return false; // was a continue from a nested operation
    ...
    return true;
}
...