|
|
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
Читаю как ORACLE рекомендует писать ф-ии. И вот если мы пишем несколько раз конструкцию return, то ORACLE утверждает ORACLEto have multiple exit points in a subprogram is a poor programming practice. Я так не считаю. Все зависит от задачи. Зачем заморачиваться с какой -либо переменной дабы определить нужно ли заходить в этот кусок кода или надо идти до конца к конструкции return. Вот например, если есть ф-ия, состоящая из ряда проверок, и при полож. срабатывании любой из проверок дальнейшее тело ф-ии не интересно, так почему бы не выскочить из ф-ии по ретурн и не делать лишних проверок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 13:19 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
Любое утверждение относительно. В данном случае имелось ввиду (ИМХО), что если текст достаточно длинный, то многочисленные выходы, расположенные в разных местах, трудно отслеживать / сопровождать. А то, что в некоторых случаях иметь несколько штук return удобно (особенно при небольшом тексте процедуры / функции) - это естественно... Правда, на мой взгляд, эта тема для форума "Программирование", а не "Проектирование БД" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 13:31 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
tru55Любое утверждение относительно. В данном случае имелось ввиду (ИМХО), что если текст достаточно длинный, то многочисленные выходы, расположенные в разных местах, трудно отслеживать / сопровождать.+1 Это из той же серии, как и использование GOTO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 14:32 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
JUNIORik, return не простой оператор. return должен много чего сделать, прежде чем управление вернётся в вызывающую програму. Как минимум, нужно почистить стек, удалить ненужные объекты из кучи, в PL/SQL может потребоваться закрыть локальные курсоры и т.п. В итоге бездумное рассовывание return увеличивает исполняемый код. Я как то даже имел системный баг, связанный с выходом из цикла for in select по return. Часто промежуточный return несёт семантику исключительной ситуации. Для этих случаев предусмотрены исключения. Но исключения нужно применять там, где без них обойтись никак нельзя. ИМХО, для генерации исключений return может быть хорошей альтернативой raise. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 15:43 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
explareturn не простой оператор. return должен много чего сделать, прежде чем управление вернётся в вызывающую програму. Как минимум, нужно почистить стек, удалить ненужные объекты из кучи, в PL/SQL может потребоваться закрыть локальные курсоры и т.п. В итоге бездумное рассовывание return увеличивает исполняемый код. Не логично. Логично было бы, чтобы сервер на своем низком уровне заменял return-ы безусловными переходами типа goto на метку типа "return". Более того, практически уверен, что внутри так и происходит, ибо это самое логично поведение, чтобы блок деинициализации выполнялся независимо от причины и места выхода из подпрограммы, а все return-ы шли к нему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 17:45 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов, а ты попробуй так сделать хотя бы для примерно такого блока. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 17:58 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
а мне кажется опечатка здесь: не poor, а pure :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 18:03 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
expla пишет: > В итоге бездумное рассовывание return увеличивает исполняемый код. > Я как то даже имел системный баг, связанный с выходом из цикла for in > select по return. Неужели у них там на оракле так всё плохо ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2009, 22:14 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
MasterZiv expla пишет: > В итоге бездумное рассовывание return увеличивает исполняемый код. > Я как то даже имел системный баг, связанный с выходом из цикла for in > select по return. Неужели у них там на оракле так всё плохо ? +1 :) у них там "другой мир". А оператор Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 09:28 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
MasterZivНеужели у них там на оракле так всё плохо ?Если не задумываться над реальной сложностью проблем - то везде хорошо, не только в оракле. авторА оператор Код: plaintext 1. 2. А как должна отработать такая конструкция? И сколько раз должен выполниться блок FINALY ? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 10:43 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
explaа ты попробуй так сделать хотя бы для примерно такого блока Не вижу проблем и для такого блока. Замените в моем утверждении "подпрограмма" на "блок", и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 10:47 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
BelyА как должна отработать такая конструкция? Зависит от конкретики. BelyИ сколько раз должен выполниться блок FINALY? Ровно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 10:50 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовРовно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока.Теперь можно соотнести это поведение с "легкостью сбора мусора при множественных return". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 11:26 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
BelyСергей ВаскецовРовно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока.Теперь можно соотнести это поведение с "легкостью сбора мусора при множественных return". Можно. Сбор мусора ОДИН РАЗ полностью аналогично наличию одного виртуального блока try..finally на весь блок. Сервер когда парсит код сам расставляет у себя такие виртуальные блоки и безусловные переходы к ним (переход на finally безусловный), если надо. Вуаля. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 11:32 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
BelyСергей ВаскецовРовно один раз в самом конце исполнения блока try..finally в том и только в том случае, если исполнение вошло внутрь tryи независимо от того, что было внутри этого блока.Теперь можно соотнести это поведение с "легкостью сбора мусора при множественных return". этого мало. Это позволяет ПРОСТО и БЕЗОПАСНО писать БЕЗОШИБОЧНЫЙ код\приложение с точки зрения ПОЛЬЗОВАТЕЛЯ. А также отслеживать исключительные ситуации (в том числе полуштатные). Ведь в этом блоке можно не только мусор собирать, но и делать анализ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 12:13 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовМожно. Сбор мусора ОДИН РАЗ полностью аналогично наличию одного виртуального блока try..finally на весь блок. Сервер когда парсит код сам расставляет у себя такие виртуальные блоки и безусловные переходы к ним (переход на finally безусловный), если надо. Вуаля.Не забываем про видимость переменных, условные переходы (IF) и динамическое выделение памяти. После этого сбор мустора перестает быть тривиальной задачей, которая может быть выполнена на момент компиляции (а значит и безусловные переходы на блоки FINALY расставить не получится). Petro123, я говорю не про понимание человека, а про операции, которые надо сделать серверу/програме перед выполнением возврата. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 16:51 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
BelyНе забываем про видимость переменных, условные переходы (IF) и динамическое выделение памяти. После этого сбор мустора перестает быть тривиальной задачей, которая может быть выполнена на момент компиляции (а значит и безусловные переходы на блоки FINALY расставить не получится). На этапе компиляции сервер может определить все возможные переходы и видимость переменных - задача не сложнее этой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 16:57 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
JUNIORikВот например, если есть ф-ия, состоящая из ряда проверок, и при полож. срабатывании любой из проверок дальнейшее тело ф-ии не интересно, так почему бы не выскочить из ф-ии по ретурн и не делать лишних проверок.Почему Вы не используете примерно такую конструкцию? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 18:11 |
|
||
|
Не согласна с утверждение документации
|
|||
|---|---|---|---|
|
#18+
PL99, это бессмысленно писать в 2 раза больше кода чем необходимо для решения задачи. Такой подход мало отличатеся от использования goto. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2009, 20:58 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=35828888&tid=1543420]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
166ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 520ms |

| 0 / 0 |
