2013-03-22 4 views
-2

Сегодня я получил комментарии к обзору кода от старшего разработчика, он указал, что каждая функция должна иметь только один оператор возврата. Я задаюсь вопросом, является ли это просто проблемой стиля кода или существует проблема безопасности, то есть проблема с потенциальной проблемой стека или неинициализированные переменные. Может ли кто-нибудь представить пример (я предпочитаю C \ C++ \ C#), чтобы показать недостатки нескольких операторов возврата? Большое спасибо.Почему «только один возврат»?

+1

Этот вопрос, вероятно, лучше подходит для codereview.stackexchange.com –

+0

IIRC (быстрый поиск в Google ничего не активировал, и я не помню, где я его читал), это произошло потому, что старые компиляторы C или Fortran или что-то получило бы все, если бы у вас было много возвратов. Однако в настоящее время это не проблема. Я бы сказал, что абсурдно возражать против множественных возвратов, но опять же, у некоторых людей есть многостраничные методы, и в этой ситуации я могу понять, почему это расстроило бы вас (хотя реальная проблема - безумие ваших методов). –

+0

Это, вероятно, верно для любого языка, на котором нет сбора мусора. – Tchoupi

ответ

1

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

Ускоренная перемотка вперед на сегодня. Если вы следуете объектно-ориентированным рекомендациям, главным образом принципу единой ответственности, ваши методы должны быть < 50 строк длинными и легко читаемыми. Наличие нескольких точек возврата не является проблемой. Фактически, они помогают предотвратить глубоко вложенный код.

Я закончу его там; Я только что заметил this StackOverflow question. Дайте это прочитать.

+0

FWIW: принятый ответ на этой странице на самом деле является * uhg-pattern * в моей книге. – 2013-03-22 04:04:32

+0

Я не знаю, что такое * uhg-pattern *, но я все время использую защитные предложения. – nunzabar

+0

Возвращение рано. В этом случае я отделяю каждое if-else (за очень небольшим исключением) и возвращаюсь в обоих расходящихся путях. Мне нравится несколько точек возврата. Мне не нравятся точки возврата, которые не находятся на «узлах листа». Может быть, это просто «предпочтения, на которые влияют функциональные языки» .. но все же * ugh-pattern * для меня. – 2013-03-22 04:24:13

1

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

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

Гораздо проще рассуждать о правильности программы с одной записью, а одно возвращение - как можно меньше циклов и прыжков и с намерением. Множественные операторы возврата отбрасывают много людей (люди все еще могут адаптироваться).

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

Смежные вопросы