Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Какой вариант предпочтительней Код: plaintext 1. 2. 3. 4. 5. или Код: plaintext 1. 2. 3. 4. вообще наличие нескольких точек выхода из функции считается плохим стилем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:20 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
.NET, Если чистый C, то второй лучше, т.к. в конце функции скорее всего придется выделенные ресурсы освобождать. Единая точка выхода как раз решает проблему освобождения ресурсов в одном месте, а не на каждом return. А в С++ - пофиг, там там такой проблемы нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:26 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
ЕМНИП Первый вариант не инлайнится. Хотя может в современных компиляторах это уже порешали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:31 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Почему "наличие нескольких точек выхода из функции считается плохим стилем"? С точки зрения читабельности кода, имхо, три проверки с return или throw куда лучше чем трехступенчатая лесенка из if-ов. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:35 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Касаемо функций. Без привязки к language. Мне больше первый вариант нравится. Он понятнее и следует guard-expressions. Удобно описывать файрволы и цепочки правил. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:44 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Dima Tне инлайнится В 99.99% случаев это на производительность не влияет. Поэтому стиль это никак не должно диктовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:52 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Вполне вероятно, что эти конструкции порождают одинаковый код. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 12:54 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky.NET, А в С++ - пофиг, там там такой проблемы нет. Мне второй вариант нравится больше в любом случае, независимо от языка. Хотя нередко использую первый вариант. Но такой код (первый вариант вариант) возникает из-за того, что я что-то не учел на момент разработки алгоритма, и приходится переделывать его на ходу, добавляя такие "аппендиксы" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 13:19 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
SashaMercury, Это никакого отношения к плохому дизайну не имеет. Это просто стиль кодирования такой. Читайте про "guard statement". В большинстве случаев они более читаемые, но в языках без автоматического управления памятью, это дает больше ошибок. К счастью только школота и по-настоящему большие профессионалы на данный момент применяют такие языки, поэтому никаких проблем нет ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 13:30 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, в книге Alexandrescu в 0 разделе "Don't sweat the small stuff. (Or: Know what not to standardize.)" сказано следующее: ex 4Single entry, single exit ("SESE"). Historically, some coding standards have required that each function have exactly one exit, meaning one return statement. Such a requirement is obsolete in languages that support exceptions and destructors, where functions typically have numerous implicit exits. Instead, follow standards like Item 5 that directly promote simpler and shorter functions that are inherently easier to understand and to make error-safe. что согласуется с вашим мнением, и с тем, к чему пришел язык С++. Однако с точки зрения чистого построения алгоритмов(простите за жаргонизмы), SESE мне кажется правильным решением. Но вероятно не в контексте С++ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 13:49 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
И все таки, неужели нет никаких скрытых проблем в С++ при использовании большого числа точек выхода из функций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 13:53 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
SashaMercuryИ все таки, неужели нет никаких скрытых проблем в С++ при использовании большого числа точек выхода из функций? нету. а в сгенерённом коде на каждый return будет просто jump на эпилог со всей очисткой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 14:05 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
SashaMercuryОднако с точки зрения чистого построения алгоритмов Дело в том, что алгоритм описывает более высокоуровневые вещи чем какие-то if. Поэтому с точки зрения алгоритма этих входных условий вообще не существует ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 14:32 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
.NETКакой вариант предпочтительней Код: plaintext 1. 2. 3. 4. 5. или Код: plaintext 1. 2. 3. 4. вообще наличие нескольких точек выхода из функции считается плохим стилем? второй вариант - его копипастить при рефакторинге проще - в мысле проще не провтыкать логический контекст и не забыть перенести DoSmth(); одна точка выхода всегда лучше, потому что у тебя может быть проблема освобождения ресурсов, которую ты рано или поздно забудешь добавить на новую точку выхода можно конечно писать finally блоки, но это еще та форма goto. причем освободить ресурсы забывают и школие и профи с сопоставимой частотой, это дело не опыта, а просто внимательности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 14:44 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
лесенкаС точки зрения читабельности кода, имхо, три проверки с return или throw куда лучше чем трехступенчатая лесенка из if-ов.согласен, тоже стараюсь все проверки вынести в первую часть функции, сам функционал во второй части, и наглядно и порядок в коде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 14:55 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
SashaMercuryИ все таки, неужели нет никаких скрытых проблем в С++ при использовании большого числа точек выхода из функций?Есть небольшие накладные расходы на механику поддержки исключений, как в скорости, так и в объеме кода. Например в MSVC есть опция /EH , которую нужно указывать. Еще единая точка выхода позволит проверять например, контракты. Но в целом, можно забить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 15:58 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
nojava.NETКакой вариант предпочтительней Код: plaintext 1. 2. 3. 4. 5. или Код: plaintext 1. 2. 3. 4. вообще наличие нескольких точек выхода из функции считается плохим стилем? второй вариант - его копипастить при рефакторинге проще - в мысле проще не провтыкать логический контекст и не забыть перенести DoSmth(); . Именно в контексте проведени рефакторинга возник этот вопрос. Допустим мы разврабатываем библиотеку и там есть большая функция с большим числом точек выхода. А потом поступает требование от заказчика, что вне зависимости о результатов работы функция перед выходом должна выводить на консоль какое-нибудь диагностическое сообщение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 17:51 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
.NETДопустим мы разврабатываем библиотеку и там есть большая функция с большим числом точек выхода. А потом поступает требование от заказчика, что вне зависимости о результатов работы функция перед выходом должна выводить на консоль какое-нибудь диагностическое сообщение. Суть сообщения какая? Если "функция была вызвана", то просто вставить сообщение в начало, если какие-то коды ошибок возвращаются и их надо вывести - то переименовать функцию и сделать ее вызов из обертки. Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 18:00 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Dima T.NETДопустим мы разврабатываем библиотеку и там есть большая функция с большим числом точек выхода. А потом поступает требование от заказчика, что вне зависимости о результатов работы функция перед выходом должна выводить на консоль какое-нибудь диагностическое сообщение. Суть сообщения какая? Если "функция была вызвана", то просто вставить сообщение в начало, если какие-то коды ошибок возвращаются и их надо вывести - то переименовать функцию и сделать ее вызов из обертки. Код: plaintext 1. 2. 3. 4. 5. да, но сигнатура то другая ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 18:03 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
.NETда, но сигнатура то другая В смысле? У тебя была my_func() ты ее переименовал в real_my_func() и написал новую my_func(), которая вызывает real_my_func() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 18:27 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Dima T.NETда, но сигнатура то другая В смысле? У тебя была my_func() ты ее переименовал в real_my_func() и написал новую my_func(), которая вызывает real_my_func() вы правы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 21:04 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 21:55 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
mayton, Код: sql 1. 2. 3. 4. 5. И никаких жаб )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 21:59 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, шалишь. Ты влез в имплементацию. А я - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 22:38 |
|
||
|
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
|
|||
|---|---|---|---|
|
#18+
maytonА я - нет. Это назвается overengineering. Когда делаешь то что не требуется за счет усложнения архитектуры. В данном случае по условию задачи сама функция выводит сообщение (а не что-то вне ее), а усложение это переход на джаву ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2016, 23:11 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=34&tid=2018469]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
| others: | 281ms |
| total: | 437ms |

| 0 / 0 |
