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

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



или

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



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

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

Без привязки к 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
19.07.2016, 12:52
    #39276196
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
Dima Tне инлайнится
В 99.99% случаев это на производительность не влияет.
Поэтому стиль это никак не должно диктовать.
...
Рейтинг: 0 / 0
19.07.2016, 12:54
    #39276200
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
Вполне вероятно, что эти конструкции порождают одинаковый код.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
19.07.2016, 13:19
    #39276222
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
if(A) { return; } DoSmth(); or if(!A) { DoSmth(); }
Anatoly Moskovsky.NET,
А в С++ - пофиг, там там такой проблемы нет.

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

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

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

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

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

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



или

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



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

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

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

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

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

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

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

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



или

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



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

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


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



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

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


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