Учитывая, что допустимы множественные операторы возврата (я не согласен, но давайте отвлечемся ), я ищу более приемлемый способ достижения следующего поведения:
Опция 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;
}
Если вы хотите обсудить несколько операторов возврата, сделайте это в этом вопросе .