powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
25 сообщений из 29, страница 1 из 2
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276160
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой вариант предпочтительней

Код: plaintext
1.
2.
3.
4.
5.
if(A) 
{ 
  return; 
} 
DoSmth(); 



или

Код: plaintext
1.
2.
3.
4.
if(!A) 
{
  DoSmth(); 
}



вообще наличие нескольких точек выхода из функции считается плохим стилем?
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276164
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NET,

Если чистый C, то второй лучше, т.к. в конце функции скорее всего придется выделенные ресурсы освобождать. Единая точка выхода как раз решает проблему освобождения ресурсов в одном месте, а не на каждом return.
А в С++ - пофиг, там там такой проблемы нет.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276169
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕМНИП Первый вариант не инлайнится. Хотя может в современных компиляторах это уже порешали.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276174
лесенка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему "наличие нескольких точек выхода из функции считается плохим стилем"? С точки зрения читабельности кода, имхо, три проверки с 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.
void Test1() {
  if !A() {
    return;
  }

  if !B() {
    throw err1;
  }

  if !C() {
    throw err2;
  }

  DoSmth();
}

void Test2() {
  if A() {
    if B() {
      if C() {
        DoSmth();
      } else {
        throw err2;
      }
    } else {
      throw err1;
    }
  }
}
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276183
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Касаемо функций.

Без привязки к language. Мне больше первый вариант нравится. Он понятнее
и следует guard-expressions. Удобно описывать файрволы и цепочки правил.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
boolean checkAccess(int IP){
  if (IP==str2ip("127.0.0.1")) 
      return true;
  if (local(IP))
      return checkEthernetAccessRule(IP);
  // others
  return false;
}
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276196
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima Tне инлайнится
В 99.99% случаев это на производительность не влияет.
Поэтому стиль это никак не должно диктовать.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276200
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вполне вероятно, что эти конструкции порождают одинаковый код.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276222
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky.NET,
А в С++ - пофиг, там там такой проблемы нет.

Мне второй вариант нравится больше в любом случае, независимо от языка. Хотя нередко использую первый вариант. Но такой код (первый вариант вариант) возникает из-за того, что я что-то не учел на момент разработки алгоритма, и приходится переделывать его на ходу, добавляя такие "аппендиксы"
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276235
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Это никакого отношения к плохому дизайну не имеет.
Это просто стиль кодирования такой.

Читайте про "guard statement".

В большинстве случаев они более читаемые, но в языках без автоматического управления памятью, это дает больше ошибок.
К счастью только школота и по-настоящему большие профессионалы на данный момент применяют такие языки, поэтому никаких проблем нет )))
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276260
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 мне кажется правильным решением. Но вероятно не в контексте С++
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276267
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И все таки, неужели нет никаких скрытых проблем в С++ при использовании большого числа точек выхода из функций?
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276281
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ все таки, неужели нет никаких скрытых проблем в С++ при использовании большого числа точек выхода из функций?
нету.

а в сгенерённом коде на каждый return будет просто jump на эпилог со всей очисткой
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276304
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryОднако с точки зрения чистого построения алгоритмов
Дело в том, что алгоритм описывает более высокоуровневые вещи чем какие-то if.
Поэтому с точки зрения алгоритма этих входных условий вообще не существует )))
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276311
nojava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETКакой вариант предпочтительней

Код: plaintext
1.
2.
3.
4.
5.
if(A) 
{ 
  return; 
} 
DoSmth(); 



или

Код: plaintext
1.
2.
3.
4.
if(!A) 
{
  DoSmth(); 
}



вообще наличие нескольких точек выхода из функции считается плохим стилем?

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

можно конечно писать finally блоки, но это еще та форма goto.

причем освободить ресурсы забывают и школие и профи с сопоставимой частотой, это дело не опыта, а просто внимательности.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276324
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лесенкаС точки зрения читабельности кода, имхо, три проверки с return или throw куда лучше чем трехступенчатая лесенка из if-ов.согласен, тоже стараюсь все проверки вынести в первую часть функции, сам функционал во второй части, и наглядно и порядок в коде.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276419
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ все таки, неужели нет никаких скрытых проблем в С++ при использовании большого числа точек выхода из функций?Есть небольшие накладные расходы на механику поддержки исключений, как в скорости, так и в объеме кода.

Например в MSVC есть опция /EH , которую нужно указывать.

Еще единая точка выхода позволит проверять например, контракты.

Но в целом, можно забить.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276551
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nojava.NETКакой вариант предпочтительней

Код: plaintext
1.
2.
3.
4.
5.
if(A) 
{ 
  return; 
} 
DoSmth(); 



или

Код: plaintext
1.
2.
3.
4.
if(!A) 
{
  DoSmth(); 
}



вообще наличие нескольких точек выхода из функции считается плохим стилем?

второй вариант - его копипастить при рефакторинге проще - в мысле проще не провтыкать логический контекст и не забыть перенести DoSmth();
.
Именно в контексте проведени рефакторинга возник этот вопрос. Допустим мы разврабатываем библиотеку
и там есть большая функция с большим числом точек выхода. А потом поступает требование от заказчика,
что вне зависимости о результатов работы функция перед выходом должна выводить на консоль какое-нибудь диагностическое
сообщение.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276560
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETДопустим мы разврабатываем библиотеку и там есть большая функция с большим числом точек выхода. А потом поступает требование от заказчика,
что вне зависимости о результатов работы функция перед выходом должна выводить на консоль какое-нибудь диагностическое
сообщение.
Суть сообщения какая? Если "функция была вызвана", то просто вставить сообщение в начало, если какие-то коды ошибок возвращаются и их надо вывести - то переименовать функцию и сделать ее вызов из обертки.
Код: plaintext
1.
2.
3.
4.
5.
my_func() {
   ret = real_my_func();
   вывод сообщения
   return ret;
}
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276563
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T.NETДопустим мы разврабатываем библиотеку и там есть большая функция с большим числом точек выхода. А потом поступает требование от заказчика,
что вне зависимости о результатов работы функция перед выходом должна выводить на консоль какое-нибудь диагностическое
сообщение.
Суть сообщения какая? Если "функция была вызвана", то просто вставить сообщение в начало, если какие-то коды ошибок возвращаются и их надо вывести - то переименовать функцию и сделать ее вызов из обертки.
Код: plaintext
1.
2.
3.
4.
5.
my_func() {
   ret = real_my_func();
   вывод сообщения
   return ret;
}


да, но сигнатура то другая
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276577
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.NETда, но сигнатура то другая
В смысле? У тебя была my_func() ты ее переименовал в real_my_func() и написал новую my_func(), которая вызывает real_my_func()
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276673
.NET
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T.NETда, но сигнатура то другая
В смысле? У тебя была my_func() ты ее переименовал в real_my_func() и написал новую my_func(), которая вызывает real_my_func()
вы правы
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276692
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
@Loggable
void real_my_func(){
   .....
}
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276695
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,
Код: sql
1.
2.
3.
4.
5.
void real_my_func()
{
  TRACE;
   .....
}



И никаких жаб ))
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276729
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, шалишь. Ты влез в имплементацию. А я - нет.
...
Рейтинг: 0 / 0
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
    #39276741
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonА я - нет.
Это назвается overengineering. Когда делаешь то что не требуется за счет усложнения архитектуры.

В данном случае по условию задачи сама функция выводит сообщение (а не что-то вне ее), а усложение это переход на джаву )))
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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