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