powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Не согласна с утверждение документации
20 сообщений из 20, страница 1 из 1
Не согласна с утверждение документации
    #35827092
JUNIORik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Читаю как ORACLE рекомендует писать
ф-ии. И вот если мы пишем несколько раз
конструкцию return, то ORACLE утверждает
ORACLEto have multiple exit points in a
subprogram is a poor programming practice.

Я так не считаю.
Все зависит от задачи.
Зачем заморачиваться с какой -либо переменной
дабы определить нужно ли заходить в этот кусок кода
или надо идти до конца к конструкции return.

Вот например, если есть ф-ия, состоящая из ряда
проверок, и при полож. срабатывании любой из проверок
дальнейшее тело ф-ии не интересно, так почему бы не выскочить из ф-ии
по ретурн и не делать лишних проверок.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35827143
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Любое утверждение относительно.
В данном случае имелось ввиду (ИМХО), что если текст достаточно длинный, то многочисленные выходы, расположенные в разных местах, трудно отслеживать / сопровождать.
А то, что в некоторых случаях иметь несколько штук return удобно (особенно при небольшом тексте процедуры / функции) - это естественно...

Правда, на мой взгляд, эта тема для форума "Программирование", а не "Проектирование БД" :)
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35827386
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55Любое утверждение относительно.
В данном случае имелось ввиду (ИМХО), что если текст достаточно длинный, то многочисленные выходы, расположенные в разных местах, трудно отслеживать / сопровождать.+1
Это из той же серии, как и использование GOTO
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35827655
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
JUNIORik,

return не простой оператор. return должен много чего сделать, прежде чем управление вернётся в вызывающую програму. Как минимум, нужно почистить стек, удалить ненужные объекты из кучи, в PL/SQL может потребоваться закрыть локальные курсоры и т.п.
В итоге бездумное рассовывание return увеличивает исполняемый код.
Я как то даже имел системный баг, связанный с выходом из цикла for in select по return.

Часто промежуточный return несёт семантику исключительной ситуации. Для этих случаев предусмотрены исключения. Но исключения нужно применять там, где без них обойтись никак нельзя. ИМХО, для генерации исключений return может быть хорошей альтернативой raise.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35828102
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explareturn не простой оператор. return должен много чего сделать, прежде чем управление вернётся в вызывающую програму. Как минимум, нужно почистить стек, удалить ненужные объекты из кучи, в PL/SQL может потребоваться закрыть локальные курсоры и т.п.
В итоге бездумное рассовывание return увеличивает исполняемый код.
Не логично. Логично было бы, чтобы сервер на своем низком уровне заменял return-ы безусловными переходами типа goto на метку типа "return". Более того, практически уверен, что внутри так и происходит, ибо это самое логично поведение, чтобы блок деинициализации выполнялся независимо от причины и места выхода из подпрограммы, а все return-ы шли к нему.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35828155
expla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Васкецов,

а ты попробуй так сделать хотя бы для примерно такого блока.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<<block1>>
declare...
begin...
   <<block11>>
   declare ...
        return; ...
   end block11;
   <<block12>>
   declare ...
        return; ...
   end block12; ...
   return; ...
end block1;
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35828163
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а мне кажется опечатка здесь:
не poor, а pure :)
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35828528
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
expla пишет:

> В итоге бездумное рассовывание return увеличивает исполняемый код.
> Я как то даже имел системный баг, связанный с выходом из цикла for in
> select по return.

Неужели у них там на оракле так всё плохо ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35828888
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
expla пишет:

> В итоге бездумное рассовывание return увеличивает исполняемый код.
> Я как то даже имел системный баг, связанный с выходом из цикла for in
> select по return.

Неужели у них там на оракле так всё плохо ?

+1 :)
у них там "другой мир".
А оператор
Код: plaintext
1.
2.
try
finally
end;
наверно никогда не появится (в отличии от сиквела).
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35829091
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНеужели у них там на оракле так всё плохо ?Если не задумываться над реальной сложностью проблем - то везде хорошо, не только в оракле.

авторА оператор
Код: plaintext
1.
2.
try
finally
end;
наверно никогда не появится (в отличии от сиквела).

А как должна отработать такая конструкция? И сколько раз должен выполниться блок FINALY ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
try
  ....
  try
    -- Еще чуть-чуть кода --
  exception
    return  12 ;
  end;
  ...
finaly
  return  14 ;
end;

...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35829104
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
explaа ты попробуй так сделать хотя бы для примерно такого блока
Не вижу проблем и для такого блока. Замените в моем утверждении "подпрограмма" на "блок", и все.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35829113
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyА как должна отработать такая конструкция?
Зависит от конкретики.

BelyИ сколько раз должен выполниться блок FINALY?
Ровно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35829244
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовРовно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока.Теперь можно соотнести это поведение с "легкостью сбора мусора при множественных return".
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35829262
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyСергей ВаскецовРовно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока.Теперь можно соотнести это поведение с "легкостью сбора мусора при множественных return".
Можно. Сбор мусора ОДИН РАЗ полностью аналогично наличию одного виртуального блока try..finally на весь блок. Сервер когда парсит код сам расставляет у себя такие виртуальные блоки и безусловные переходы к ним (переход на finally безусловный), если надо. Вуаля.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35829407
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyСергей ВаскецовРовно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока.Теперь можно соотнести это поведение с "легкостью сбора мусора при множественных return".
этого мало.
Это позволяет ПРОСТО и БЕЗОПАСНО писать БЕЗОШИБОЧНЫЙ код\приложение с точки зрения ПОЛЬЗОВАТЕЛЯ. А также отслеживать исключительные ситуации (в том числе полуштатные).
Ведь в этом блоке можно не только мусор собирать, но и делать анализ.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35830266
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ВаскецовМожно. Сбор мусора ОДИН РАЗ полностью аналогично наличию одного виртуального блока try..finally на весь блок. Сервер когда парсит код сам расставляет у себя такие виртуальные блоки и безусловные переходы к ним (переход на finally безусловный), если надо. Вуаля.Не забываем про видимость переменных, условные переходы (IF) и динамическое выделение памяти.
После этого сбор мустора перестает быть тривиальной задачей, которая может быть выполнена на момент компиляции (а значит и безусловные переходы на блоки FINALY расставить не получится).

Petro123, я говорю не про понимание человека, а про операции, которые надо сделать серверу/програме перед выполнением возврата.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35830276
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BelyНе забываем про видимость переменных, условные переходы (IF) и динамическое выделение памяти. После этого сбор мустора перестает быть тривиальной задачей, которая может быть выполнена на момент компиляции (а значит и безусловные переходы на блоки FINALY расставить не получится).
На этапе компиляции сервер может определить все возможные переходы и видимость переменных - задача не сложнее этой.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35830434
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JUNIORikВот например, если есть ф-ия, состоящая из ряда
проверок, и при полож. срабатывании любой из проверок
дальнейшее тело ф-ии не интересно, так почему бы не выскочить из ф-ии
по ретурн и не делать лишних проверок.Почему Вы не используете примерно такую конструкцию?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
MyCheck exception;
pragma exception_init(MyCheck , - 20001 );
...
IF not <проверка>  THEN
         RAISE MyCheck ; 
END IF;
...
EXCEPTION
WHEN MyCheck THEN RETURN - 1 ;
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35830575
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PL99,

это бессмысленно писать в 2 раза больше кода чем необходимо для решения задачи. Такой подход мало отличатеся от использования goto.
...
Рейтинг: 0 / 0
Не согласна с утверждение документации
    #35831743
Фотография SNUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123наверно никогда не появится (в отличии от сиквела).
было ещё когда Вы под стол ходили
:o)
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Не согласна с утверждение документации
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]