2013-07-16 2 views
2

я был тест в методологии ООП и был задан следующим True \ ложного вопроса:использует исключение для возврата из законной рекурсии?

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

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

По-моему, это аналогии для упаковки блока с try \ catch при работе с IndexOutofBounds, что неверно кодирует.

Что, по-вашему, по вашему мнению?

ответ

6

Исключение из с рекурсии Неправильный. Исключения для исключительных ситуаций. Возвращение из рекурсии не является исключительной ситуацией.

Из учебников Java языка:

Java-язык программирования использует исключения ошибок рукояток и другие исключительные события.

и

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

Это является неправильно, и против стандартной практики программирования, потому что программисты ожидают исключения, которые будут использоваться для исключительных ситуаций. Любое другое использование - неправильный. Период.

+1

Ну, если вы рекурсивно 10.000 раз, то возврат * является действительно исключительным, не так ли? И, да, это нарушает нормальный поток инструкций. – Ingo

+1

@Ingo Возврат * не * исключительный. – johnchen902

+1

Плюс есть серьезные WOMF-комедии, когда вы помещаете 'catch (Exception e) ...' где-то в стеке по несвязанным причинам, и вдруг ваша функция не возвращается должным образом. – jozefg

1

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

Однако использование исключений для возврата из глубокой рекурсии было давно использовано программистами Caml, чтобы иметь возможность закончить рекурсию, не снимая всех вызовов (теряя время для ничего).

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

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

-2

Это абсолютно законно по правилам Java и JVM, и семантика понятна. Тем не менее, поскольку речь идет о потоке управления, это почти не имеет отношения к ООП. Та же функция может использоваться на языке, который не является OO, но имеет исключения.

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

Это не значит: это хорошая практика. Но тогда .... хорошая практика - это то, что понимает большинство программистов на Java, и это не так много, ИМХО ....

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

+2

* Исключение * следует использовать только с чем-то исключительным *. – johnchen902

+0

@ johnchen902 Ну, вы знаете, что исключения throwing/catching имеют очень хорошо определенную семантику в Java. Могут быть веские причины сделать «длинный прыжок» из функции рекурсинга. Конечно, это не то, что происходит в повседневном программировании. – Ingo

+0

Исключение не является длинным прыжком. JVM будет только ** отступить **, ** кадр за кадром **. – johnchen902

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