2009-04-02 2 views
3

Можно создать дубликат:
Should a function have only one return statement?Почему это хорошая практика, чтобы вернуться в конце метода

Парень программист спросил меня, почему мы должны всегда вернуться в конце метода ?

Мы оба учили всегда иметь только один оператор возврата в методе, а не несколько разбросанных по всему коду.

Любые веские причины для этого?

ответ

18

Существует школа мысли, в которой говорится, что у вас должна быть одна точка входа и одна точка выхода. Если у вас есть больше, вы должны реорганизовать код, чтобы быть более четким.

Я не разделяю эту мысль, хотя и часто используют защитные оговорки, например:

public void DoSomethingOnMales(Person p) 
{ 
    if (p.Sex != Sex.Male) 
     return; 
    .... 
} 

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

+0

Хорошие эмпирические правила, поэтому +1. На мой взгляд, возврат в конце функции - это случай по умолчанию, и в зависимости от типа функции раннее возвращение является либо ошибкой (как в ваших условиях защиты), либо ранним успехом (т. Е. Когда поиск чего-то). – OregonGhost

1

Вы можете вернуться в любое время, это не обязательно должно быть в конце метода. Единственное, на что нужно обратить внимание, это то, что у вас нет недостижимого кода: код, который никогда не будет достигнут, потому что вы всегда возвращаетесь до его достижения.

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

+1

С современными компиляторами вам не нужно беспокоиться, если у вас есть недостижимый код, потому что компилятор скажет вам (по крайней мере, компилятор C#). – OregonGhost

+0

Resharper, кажется, предпочитает многократную отдачу от гнездования. например, оператор IF, который возвращает значение или null, превращается в IF, если что-то возвращает null; а другой - за пределами оператора IF со значением. –