|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Про то, что иметь много точек выхода из функции не есть хорошая практика, Вам кажется уже говорили... Но вот это Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
Я бы написал например так: Код: plaintext 1. 2. 3.
PSS. А еще у Вас шрифт в статье дурацкий - читать сложно. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2007, 10:16 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
И то что дальше объявляется very good code - тоже под большим вопросом. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2007, 10:21 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин Маркиметь много точек выхода из функции не есть хорошая практика В статье четко написано в каких именно случаях правильнее отойти от правила единой точки выхода. И в этой части я с автором согласен. Так как иначе возникают чрезмерные вложенности if в которых часто забывают else и которые трудно модифицировать и отлаживать, и в которых часто дублируется код из разных уровней вложенности. Также возникают всевозможные флаги которые по сути те же выходы, но формально (синтаксически) ими не являются и это затрудняет понимание того, что делает код. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2007, 13:08 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВ статье четко написано в каких именно случаях правильнее отойти от правила единой точки выхода. Да, есть, при беглом просмотре не заметил. Но все равно специально писать условия через not - менее наглядно. Потому как обычно условия формулируются по принципу "если то-то, то так-то", а не "если не то-то то так-то". Соответственно код не перегруженный кучей условий not более понятен для восприятия. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2007, 15:05 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Марк, ты же знаешь - сколько программистов, столько и мнений :-). Я описал своё видение, и если другие считают наоборот - это вполне нормально и ожидаемо. Описанные трюки и решения не из пальца высосаны, а либо взяты от мастеров, с которыми общался, либо пришёл к ним методом проб и ошибок сожрав не одну собаку. Заранее знаю, что у статьи будет немало оппонентов, причём зачастую привыкших к не совсем правильным решениям, приняв их в начале как авторитетные (я могу сейчас в пух и прах разбомбить ту-же теорию о единой точке выхода, с которой многие носятся как с писанной торбой, хотя легче отослать к патриарху - Дейкстре), а когда привык к чему-нибудь, то отвыкнуть очень нелегко (примеры - курение или сваливание нескольких SQLей в одну кучу). Я всё это не от нефиг делать написАл, а потому что наболело - работал я тогда в фирме (слава Богу, свалил, не поддавшись на предложение остаться на постоянку в правительстве провинции - такого счастья мне не надо!), где в функциях было больше строк кода, чем в исходние первой версии Линукса (имею в виду В ОДНОЙ ФУНКЦИИ!!!), а мой экран был залапан пальцем так, что периодически приходилось вытирать отпечатки как после ограбления (например, держал на экране уровень 5-го таба из 7, пытаясь найти if-овский end if с помощью скроллинга вниз). Кстати, всем привет от живущего у нас в Калгари мужичка, бывшего частью PowerBuilder team. Увы, работает дибиэем в нефтяной отрасли, в будущее PowerBuilder-а не верит... Кстати, однофамилец того самого великого Дейкстры! ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2007, 19:41 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyТакже возникают всевозможные флаги которые по сути те же выходы, но формально (синтаксически) ими не являются и это затрудняет понимание того, что делает код.Абсолютно верно! Какая логически разница сделать return сразу или через посредника, сначала перейдя к нему, чему хошь-не хошь будет посвящено несколько лишних строк? Это как exception handler - абсолютно тот-же самый goto если говорить в рамках одного скрипта. Но скажи, что используешь goto - забросают камнями. А какая нафиг разница? Не использовать этот удобный в определённых условиях оператор только потому, что несколько десятилетий назад с ним боролись, пытаясь заменить на if (программеры старой закалки продолжали писать на появившихся языках 3-го поколения в стиле ассемблера, к которому привыкли, производя спагетти-код - тогда борьба с goto была оправдана, но вошла во все учебники программирования явно потому, что авторы бездумно повторяли чужую и устаревшую мысль). Короче, думать надо, а не делать copy/paste чужих идей на полном автомате. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2007, 20:09 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
ИМНО Неплохая статья и в нагрузку еще ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2007, 20:24 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Ursego Я всё это не от нефиг делать написАл, а потому что наболело - работал я тогда в фирме Это понятно, что плохое правило лучше чем никакое. Но не нужно же давать откровенно вредные советы. Про good code - я уже упомянул. Посмотрим на very good code. Я уж не говорю про то, что разобраться в 4 строках кода легче чем в 9 + объявление переменных и то что в последствии между этими строками кода еще чего-нибудь может получиться. Я не говорю, что таким способом записи фактически жестко прописывается план исполнения... Понимаете, 3 select'а написанные подряд - это совсем не тоже самое, что 1 select. В результате далеко не всегда будет одно и тоже. UrsegoКакая логически разница сделать return сразу или через посредника, сначала перейдя к нему, чему хошь-не хошь будет посвящено несколько лишних строк? Разница вот какая. Если у меня есть один return, то я точно знаю место в скрипте, которое будет исполняться непосредственно перед выходом из процедуры. Соответственно если мне понадобилось изменить процедуру так, чтобы для каких-то целей выделялся какой-то ресурс, то код по его освобождению я напишу 1 раз в конце функции. Если у меня много точек выхода, то я должен найти все и заменить Код: plaintext 1. 2. 3. 4. 5.
Кстати по поводу оформления таких кусочков кода Я предпочитаю всегда писать Код: plaintext 1. 2.
Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 11:18 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин МаркСоответственно если мне понадобилось изменить процедуру так, чтобы для каких-то целей выделялся какой-то ресурс, то код по его освобождению я напишу 1 раз в конце функции. Если у меня много точек выхода, то я должен найти все и заменить Кошмар! "найти и заменить"... нет слов. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 11:40 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
ЗоринАндрейКошмар! "найти и заменить"... нет слов. 1. Сколько точек выхода будет в данной функции? Посчитать по пальцам? 2. Оператор try есть не во всех версиях PB (по-моему с 7). ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 11:46 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин МаркЕсли у меня есть один return, то я точно знаю место в скрипте, которое будет исполняться непосредственно перед выходом из процедуры. Соответственно если мне понадобилось изменить процедуру так, чтобы для каких-то целей выделялся какой-то ресурс, то код по его освобождению я напишу 1 раз в конце функции. Если у меня много точек выхода, то я должен найти все и заменить Код: plaintext 1. 2. 3. 4. 5.
Еще раз. "if not condition then return -1" касается только предусловий, т.е. определения возможности выполнения основного кода ф-и. И в этот момент о выделении или освобождении ресурсов речь еще не идет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 12:30 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин Марк1. Сколько точек выхода будет в данной функции? Посчитать по пальцам? Одна. Локшин Марк2. Оператор try есть не во всех версиях PB (по-моему с 7). Если кто-то еще пользуется шестеркой - мне остается только посочувствовать. ИМХО странно вырабатывать стиль принимая во внимание версии 10летней давности. Все равно что сказать - мы не будем использовать ANSI Join syntax потому что его не было в версии x.x восемь лет назад. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 12:33 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЕще раз. "if not condition then return -1" касается только предусловий, т.е. определения возможности выполнения основного кода ф-и. И в этот момент о выделении или освобождении ресурсов речь еще не идет. В случае нескольких уровней Exception позволяет выйти сразу на верхний уровень не засоряя код чем-то таким Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 12:36 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Anatoly Moskovskyкасается только предусловий, т.е. определения возможности выполнения основного кода ф-и. И в этот момент о выделении или освобождении ресурсов речь еще не идет. Никто не сказал, что "parameters checking" не потянет необходимости выделения ресурсов. Например - передаются 2 параметра - имена файлов, а в функции необходимо чтобы файлы уже существовали. Поэтому мне нужно будет попытаться открыть - 1 файл и завершиться с ошибкой если его нет, а затем открыть второй файл и освободить первый файл и завершиться с ошибкой если нет второго. И это всего лишь "parameters checking". ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 12:40 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
ЗоринАндрейОдна. Ну и к чему тогда твой пассаж? Я понимаю, если бы это было ответом на это Anatoly MoskovskyТак как иначе возникают чрезмерные вложенности if в которых часто забывают else и которые трудно модифицировать и отлаживать, или вот это UrsegoНо скажи, что используешь goto - забросают камнями. А какая нафиг разница? Не использовать этот удобный в определённых условиях оператор Но оспаривать кодом с одной точкой возврата мой тезис Локшин Маркиметь много точек выхода из функции не есть хорошая практика и далее поясняющий пример по-моему как-то не логично. ЗоринАндрейЕсли кто-то еще пользуется шестеркой - мне остается только посочувствовать. Это было так, к слову :). Но ведь кто-то еще пользуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 12:58 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Код программиста - это тот же почерк Чаще всего он уникален, есть просто вещи которыми каждый руководствуется неосознано (речь идет не о новичках, которым как первоклашкам и надо выработать почерк - косые палочки писать:)). Стиль вырабатывается годами Так что религиозные войны тут не к чему, лучше сообща сформировать правила и их альтернативы ----------------------------------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 13:07 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин МаркНу и к чему тогда твой пассаж?Э.... Ну да... Я тут про годовщину свадьбы забыл. Не то что форум читать внимательно... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 13:14 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин Марк Anatoly Moskovskyкасается только предусловий, т.е. определения возможности выполнения основного кода ф-и. И в этот момент о выделении или освобождении ресурсов речь еще не идет. Никто не сказал, что "parameters checking" не потянет необходимости выделения ресурсов. Например - передаются 2 параметра - имена файлов, а в функции необходимо чтобы файлы уже существовали. Поэтому мне нужно будет попытаться открыть - 1 файл и завершиться с ошибкой если его нет, а затем открыть второй файл и освободить первый файл и завершиться с ошибкой если нет второго. И это всего лишь "parameters checking". Этот случай не предусловие. Ошибка происходит уже при работе основного кода функции (в котором попытка открытия файла для последующего чтения используется для проверки наличия файла). В этом случае правильнее всего применять генерацию исключения при ошибке чтения файла с освобождением ресурсов в FINALLY. А проверку наличия выделить в отдельный блок кода в начале ф-и, не мешая его с обработкой файла. Я уже не говорю о том, что должна быть отдельная ф-я проверяющая наличие файла (допустим что в PB такой нет) , и тогда никаких проблем в освобождением ресурсов не будет. И читаемость кода повышается - явный вызов of_CheckIfFileExists понятен сразу, тогда как FileOpen; If ... еще нужно интерпретировать из контекста. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 14:17 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Да, goto - это жесть ----------------------------------------------------------------------------- Главная деталь любой машины - голова ее владельца ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 14:31 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyА проверку наличия выделить в отдельный блок кода в начале ф-и, не мешая его с обработкой файла. Я уже не говорю о том, что должна быть отдельная ф-я проверяющая наличие файла (допустим что в PB такой нет) , и тогда никаких проблем в освобождением ресурсов не будет. И читаемость кода повышается - явный вызов of_CheckIfFileExists понятен сразу, тогда как FileOpen; If ... еще нужно интерпретировать из контекста. Ага щаз. А если голову включить? Проверка должна, именно должна захватывать файл чтобы никто с ним ничего не мог сделать. FileExists то проверить наличие сможет, но только для Вашего личного успокоения, и ничего более. Потому как сразу после исполнения FileExists он может быть кем угодно удален (сюрприз-сюрприз). И хоть обпишитесь вы своих функций проверки - все будет бестолку. Я же говорю - не нужно давать откровенно вредных советов. Вы Анатолий (если сами не заметили) только что просто очень наглядно продемонстрировали к чему такой подход ведет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 14:43 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин МаркАга щаз. А если голову включить? Проверка должна, именно должна захватывать файл чтобы никто с ним ничего не мог сделать. FileExists то проверить наличие сможет, но только для Вашего личного успокоения, и ничего более. Потому как сразу после исполнения FileExists он может быть кем угодно удален (сюрприз-сюрприз). Вы невнимательно читаете. У меня проверка наличия вынесена отдельно, но при этом обработка ошибок при чтении файлов сохраняется. Эти два действия не одно и тоже и мешать их в кучу - только затруднять дальнейшее понимание написанного кода. Отсутствие файла при проверке предусловий - штатная ситуация, а вот исчезновение файла после проверки на наличие - это нештатная ситуация (исключение) и решаются они разными способами. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 15:04 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyОтсутствие файла при проверке предусловий - штатная ситуация, а вот исчезновение файла после проверки на наличие - это нештатная ситуация (исключение) и решаются они разными способами. Что значит разными способами? Какая мне разница когда удалили файл - за секунду до того как я его открыл или за час? С чего это вдруг в одном случае не штатная ситуация, а в другом - штатная? И почему от этого должен зависить способ решиния проблемы? Anatoly Moskovskyобработка ошибок при чтении файлов сохраняется По-моему про это вообще никто не говорил. Также никто не говорил, например, о проблемах с взаимоблокировками. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 15:44 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин Марк Anatoly MoskovskyОтсутствие файла при проверке предусловий - штатная ситуация, а вот исчезновение файла после проверки на наличие - это нештатная ситуация (исключение) и решаются они разными способами. Что значит разными способами? Какая мне разница когда удалили файл - за секунду до того как я его открыл или за час? С чего это вдруг в одном случае не штатная ситуация, а в другом - штатная? И почему от этого должен зависить способ решиния проблемы? Anatoly Moskovskyобработка ошибок при чтении файлов сохраняется По-моему про это вообще никто не говорил. Также никто не говорил, например, о проблемах с взаимоблокировками. Все описанные Вами проблемы могут возникнуть независимо от стиля кодирования, поэтому не вижу смысла обсуждать их в этом топике. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 16:08 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВсе описанные Вами проблемы могут возникнуть независимо от стиля кодирования, поэтому не вижу смысла обсуждать их в этом топике. Проблемы -то возникнуть могут только как Вы их предлагаете решать? В таком духе: Код: plaintext 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 16:28 |
|
Праграмист, пешы красива!
|
|||
---|---|---|---|
#18+
Локшин Марк Anatoly MoskovskyВсе описанные Вами проблемы могут возникнуть независимо от стиля кодирования, поэтому не вижу смысла обсуждать их в этом топике. Проблемы -то возникнуть могут только как Вы их предлагаете решать? Есть множество способов решить указанные проблемы, но ни один не имеет отношение к стилю кодирования (напомню тему топика). По этой причине я не собираюсь их обсуждать. Кроме того это просто неинтересно - все техники работы с разделяемыми ресурсами давно известны и тут нечего обсуждать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2007, 16:46 |
|
|
start [/forum/topic.php?fid=15&msg=34863678&tid=1336340]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
69ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 180ms |
0 / 0 |