Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/88: Рейтинг темы: голосов - 88, средняя оценка - 4.80
Одессит
 Аватар для kylroma
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2

Выход из метода/функции

21.04.2017, 15:51. Показов 18308. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я всегда использовал первый вариант выхода из метода. Но мне настоятельно посоветовали использовать второй вариант, так как код должен быть линейным.
Как используют выход из метода в серьёзных проектах?

Вариант 1
C++
1
2
3
4
5
6
7
8
9
10
11
12
void foo()
{
  if(val == nulptr){
    return;
  }
// остальной код
 
  if(bar() != *val){
    return;
  }
// ещё какой-то код
}
Вариант 2
C++
1
2
3
4
5
6
7
8
9
10
11
void foo()
{
  if(val != nulptr){
 
// остальной код
 
    if(bar() == *val){
      // ещё какой-то код
    }
  }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.04.2017, 15:51
Ответы с готовыми решениями:

Выход из функции, если эта работает в другой функции
Здравствуйте, у мне такая проблема. У меня есть одна функция, которая полностью контролирует всю менюшку в WinConsoleAppl. И она...

Принудительный выход из метода
Задача:Ведите логин и пароль ,если пароль верный пустить в систему,нет пускай вводит еще раз . Попытки ввода ограничить 3. У меня...

Выход из метода типа Void
Как в методе типа void, принудительно выйти из метода? У меня метод для поиска элементов в бинарном дереве, только вот return не работает....

9
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
21.04.2017, 15:59
Чем больше уровней вложенности, тем хуже разбираться в коде. Так что первый вариант, на мой взгляд, более читаемый. А ещё можно разбивать на большее число функций.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void foo()
{
  if(val != nulptr)
    do_code();
}
 
void do_code()
{
    // остальной код
 
    if(bar() == *val){
      // ещё какой-то код
    }
}
1
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
21.04.2017, 16:17
Цитата Сообщение от kylroma Посмотреть сообщение
Но мне настоятельно посоветовали использовать второй вариант
кто посоветовал?
это бред.
используйте первый вариант.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
21.04.2017, 16:24
Есть такое мнение, что когда в функции один return это хорошо. Но не надо применять его не думая, первый код выглядит более читабельно.

Добавлено через 2 минуты
Один return удобно использовать например в таких случаях
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if (condition1)
{
    return "asdf";
}
 
if (condition2)
{
    return "asdfasdf";
}
 
if (condition3)
{
    return "fdas";
}
Тут считает кошерным сделать так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
std::string returnValue;
 
if (condition1)
{
     returnValue = "asdf";
}
 
if (condition2)
{
    returnValue = "asdfasdf";
}
 
if (condition3)
{
    returnValue = "fdas";
}
 
return returnValue;
Но, опять же, если первый вариант легко читается, то почему бы и нет.
1
Одессит
 Аватар для kylroma
243 / 88 / 44
Регистрация: 30.12.2013
Сообщений: 316
Записей в блоге: 2
21.04.2017, 16:29  [ТС]
GbaLog-
Настаивал на втором варианте знакомый синьёр-помидор.
Всем спасибо. Буду использовать первый вариант.
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
21.04.2017, 18:33
Цитата Сообщение от kylroma Посмотреть сообщение
Настаивал на втором варианте знакомый синьёр-помидор.
Причины из-за которых следует придерживаться этого принципе следующие:
сложность отладки такого кода, не всегда очевидно когда произошёл возврат из функции, к примеру мы имеем несколько return и никогда точно не можем сказать какой из них был вызван;
проблемы с сопровождением и изменением. При взгляде на код, особенно, если он большой не всегда заметны существующие точки выхода. В связи с этим поведение добавленного кода может быть непредсказуемо, не известно достоверно, будет ли выполнен ваш добавленный в конец функции код или нет. Для того, чтобы быть уверенным в этом, вам необходимо однозначно оценить все точки выхода, понять логику, а возможно и внедрить перед каждой точкой выхода вызов вашего кода.
https://habrahabr.ru/post/40841/
1
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
27.04.2017, 17:08
Цитата Сообщение от dailydose Посмотреть сообщение
будет ли выполнен ваш добавленный в конец функции код или нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template <class func_t>
class do_it_no_matter_what
{
public:
    do_it_no_matter_what(func_t func) : func_(func) {}
    ~do_it_no_matter_what() { func(); }
private:
    func_t func_;
};
 
void something_important() {}
 
void func()
{
    do_it_no_matter_what yes_i_do_it(something_important);
    // ...
    if (cond1) return;
    // ...
    if (cond2) return;
    // ...
}
0
 Аватар для dailydose
671 / 217 / 88
Регистрация: 21.07.2016
Сообщений: 1,036
Записей в блоге: 2
27.04.2017, 20:15
John Prick,
IMHO, я против единой точки выхода.
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
27.04.2017, 21:19
dailydose, я не совсем о том, а о том, что если кровь из носу надо выполнить какой-то код перед выходом из функции, а времени искать все return'ы нет, то можно воспользоваться вон той фишкой.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
27.04.2017, 22:20
Второй подход мне больше нравится. Он позволяет писать меньше кода.
Если правильно расставлять отступы скопов и писать информативные комментарии, то второй вариант не уступает первому.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.04.2017, 22:20
Помогаю со студенческими работами здесь

Выход из рекурсивного метода не осуществляется по Return
Почему-то после return опять рекурсию повторяет, мб я неправильно её написал ? private string FileIndexCreate() { ...

Выход из метода на заданное время и возврат в него.
Добрый день. Пользуюсь диспетчером Haltа, тот который EERTOS.c. Все в принципе устраивает, но есть таск который выполняется очень...

Выход из метода после срабатывания одного из условий в Switch
Здравствуйте! Возникла проблемка. Имеется 4 блока кода, которые должны выполнится в методе, но после того как выполняется один из...

Выход из метода, если возраст сотрудника не попадает в допустимый интервал
public void AddCoWorker() { ***** int age;// возраст сотрудника (отталкиваясь от пола) while (true) { ...

"Выход" из метода без ошибки
прошиваю одну железку сейчас вот так: private void WriteFirmware(){ try { String boundary =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru