Это злоупотребление попыткой / наконец? - PullRequest
31 голосов
/ 09 февраля 2010

Учитывая, что допустимы множественные операторы возврата (я не согласен, но давайте отвлечемся ), я ищу более приемлемый способ достижения следующего поведения:

Опция A : многократный возврат, повторный кодовый блок

public bool myMethod() {
    /* ... code ... */

    if(thisCondition) {
        /* ... code that must run at end of method ... */
        return false;
    }

    /* ... more code ... */

    if(thatCondition) {
        /* ... the SAME code that must run at end of method ... */
        return false;
    }

    /* ... even more code ... */

    /* ... the SAME CODE AGAIN that must run at end of method ... */
    return lastCondition;
}

Мне грустно видеть, что один и тот же (маленький) блок кода повторяется три раза каждый раз, когда метод возвращается. Кроме того, я хотел бы уточнить, что два return false утверждения, приведенные выше, безусловно, можно описать как возвращающие промежуточный метод ... они абсолютно не являются «защитными утверждениями».

Является ли вариант B слегка более приемлемым? Я чувствую, что могу злоупотреблять попыткой / наконец, и надеюсь, что есть нечто совершенно иное, чем я должен заниматься.

Опция B : множественные возвраты, блок try / finally (без блоков / исключений catch)

public bool myMethod() {
    try {
        /* ... code ... */

        if(thisCondition) {
            return false;
        }

        /* ... more code ... */

        if(thatCondition) {
            return false;
        }

        /* ... even more code ... */

        return lastCondition;
    } finally {
        /* ... code that must run at end of method ... */
    }
}

Наконец, вариант C - лучшее решение в моей книге, но моей команде не нравится этот подход по любой причине, поэтому я ищу компромисс.

Опция C : одинарный возврат, условные блоки

public bool myMethod() {
    /* ... code ... */

    if(!thisCondition) {
        /* ... more code ... */
    }

    if(!thisCondition && !thatCondition) {
        /* ... even more code ... */
    }

    /* ... code that must run at end of method ... */
    return summaryCondition;
}

Если вы хотите обсудить несколько операторов возврата, сделайте это в этом вопросе .

Ответы [ 11 ]

0 голосов
/ 09 февраля 2010

Использование try / finally для управления потоком похоже на использование GOTO.

...