Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
#1

Какой вариант оформления функции лучше? - C++

14.07.2014, 17:36. Просмотров 617. Ответов 16
Метки нет (Все метки)

Допустим, есть функция, которая что-то делает и, возвращает булево значение, в зависимости от того, получилось это сделать или нет.

C++
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
30
31
32
33
34
35
36
37
38
39
40
41
42
//Вариант 1
bool func(int a)
{
    if (a != 0)
    {
        /*
        Тут код
        строчек
        на 10 - 15
        */
        return true;
    }
    return false;
}
 
//Вариант 2
bool func(int a)
{
    if (a == 0) return false;
    else
    {
        /*
        Тут код
        строчек
        на 10 - 15
        */
        return true;
    }
}
 
 
//Вариант 3
bool func(int a)
{
    if (a == 0) return false;
    /*
    Тут код
    строчек
    на 10 - 15
    */
    return true;
}
Если у вас есть вариант получше, то продемонстрируйте его)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2014, 17:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Какой вариант оформления функции лучше? (C++):

Какой вариант более оптимальный? - C++
Доброго времени суток. Пишу лабу - распознаватель числовых констант. Возник вопрос, как оптимальнее, с точки зрения выполнения кода...

Какой вариант конструктора использовать правильней? - C++
Два примера кода, какой из них использовать более корректно и профессионально? 1) card(){ } card (deck_1 value_1, deck_2...

Наследование vs Композиция vs Агрегация: что лучше выбрать? Как лучше передавать объекты в функции? - C++
Добрый день!! Дело вот в чём, я хочу создать класс, внутри которого будут созданы объекты других классов (реализованных в некоторой...

Функции и файлы (Павловская Т.А.) Вариант 18 - C++
Здравствуйте, куча лаб и все ндо сделать до понедельника-вторника... Помогите, чем сможете, оч прошу, обещаю учиться лучше и помогать...

Выбрать вариант не имеющий ошибки и к каждому написать почему этот вариант правильный/неправильный - C++
Прошу помогите, я плохо понимаю c++, да и простите если не в той теме, в общем, дали задание: Выбрать вариант не имеющий ошибки и к...

Как бы вы написали кусок программы, Вариант 1 или Вариант 2? - C++
Как бы вы написали кусок программы Вариант 1 или Вариант 2 ? Вариант 1. double Value0 = value0 / 100; switch (i){ case 1: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Тамика
Котовчанин
870 / 450 / 143
Регистрация: 16.02.2010
Сообщений: 2,981
Записей в блоге: 27
14.07.2014, 17:41 #2
C++
1
2
3
4
bool func(int a)
{
    return a;
}
Добавлено через 55 секунд
Но это если совсем в лоб.
0
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
14.07.2014, 21:41  [ТС] #3
Тамика, Не, нолик я чисто для примера взял.
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
14.07.2014, 21:48 #4
я придерживаюсь правила, что должно быть как можно меньше return'ов, поэтому делаю так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool func(int a)
{
    bool retVal = false;
    
    if (/*condition*/) {
        /*
        Тут код
        строчек
        на 10 - 15
        */
        retVal = true;
    }
 
    return retVal;
}
0
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
14.07.2014, 21:51 #5
Старайтесь придерживаться правила "один выход из функции"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool func(int a)
{
    bool result = false;
 
    if (a != 0)
    {
        result = true;
        /*
        Тут код
        строчек
        на 10 - 15
        */
    }
    return result;
}
Добавлено через 39 секунд
Ать, почти успел
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
14.07.2014, 22:02 #6
orange_fox, а я скажу, что правило "один выход из функции" совсем не актуально для С++. Оно было актуально для ассемблера и в старые времена, когда компиляторы не умели нормально оптимизировать код.
Код должен отражать алгоритм. Как можно более ясно. Если мы впихиваем в наш алгоритм какие-то лишние переменные лишь только затем, чтобы соответствовать некоему правилу, то, ИМХО, это больше похоже на культ.

ЗЫ. Вышеотписавшиеся, прошу вас не устраивать холивар со мной на эту тему. Пусть ТС сам решает.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.07.2014, 22:06 #7
Цитата Сообщение от soon Посмотреть сообщение
Старайтесь придерживаться правила "один выход из функции"
Это вопрос скорее холиварный, чем научный. Предлагаю посмотреть ещё на ацкий вариант:
C++
1
2
3
4
5
6
7
bool func( int a )
{
    return a ? 
        // несколько строк, но разделять надо запятой
        true
    : false;
}
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
14.07.2014, 22:10 #8
Цитата Сообщение от DrOffset Посмотреть сообщение
Оно было актуально для ассемблера и в старые времена, когда компиляторы не умели нормально оптимизировать код.
[не холивара ради] На самом деле нет. Оптимизация тут ни при чем, тут вопрос читабельности. Программист, читая твой код, будет инстинктивно искать return в конце функции и хорошо если это будет единственный return на все тело ф-ции. В противном случае есть шанс, что он пропустит один из многих return'ов. В некоторых случаях, бесспорно, много return'ов не влияют на читабельность и понимание кода, но в больших функциях это правило очень полезно. Вот здесь есть хорошие примеры, когда это на руку.
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
14.07.2014, 22:12 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
но в больших функциях это правило очень полезно.
Вот поэтому больших функций быть и не должно.
0
Mr.X
Эксперт С++
3049 / 1694 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
14.07.2014, 22:16 #10
Ну, если есть логическое условие, то его и надо возвращать или присваивать возвращаемому значению.
Мне кажется вот так логичнее и читабельнее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool func(int a)
{
    bool    bool_res    =   a != 0;
 
    if( bool_res )
    {
        /*
        Тут код
        строчек
        на 10 - 15
        */
    }
 
    return  bool_res;
}
0
DrOffset
7152 / 4293 / 968
Регистрация: 30.01.2014
Сообщений: 7,094
14.07.2014, 22:21 #11
Все таки холивар .

Цитата Сообщение от Kastaneda Посмотреть сообщение
Программист, читая твой код, будет инстинктивно искать return в конце функции и хорошо если это будет единственный return на все тело ф-ции. В противном случае есть шанс, что он пропустит один из многих return'ов.
Если следовать этой логике, то исключения - это зло в последней инстанции.
Я, все же, склонен считать, что это надумано. Я сам имею своих пользователей, и с десяток лет активно работаю с чужим кодом. По опыту могу сказать, что это не такая серьезная проблема, как оно может представляться.

Цитата Сообщение от Kastaneda Посмотреть сообщение
но в больших функциях это правило очень полезн
Больших функций стоит избегать. По разным причинам. Многие люди в принципе сложно воспринимают код, рассредоточенный на пару (иногда десятков), страниц. Тут никакие return в конце не спасут.

Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот здесь есть хорошие примеры, когда это на руку.
В некоторых примерах по этой ссылке противопоставляется хороший код с выносом return в конец функции и плохой код с несколькими return в середине. Чтобы было ясно, я не выступаю против подхода "return в конце" когда это целесообразно. Я лишь против культов.
0
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,417
Записей в блоге: 3
Завершенные тесты: 1
14.07.2014, 22:30 #12
ну еще можно:
C++
1
2
3
4
5
6
7
8
bool func (int a)
{
    if ( a == 0 )
        goto out ;
    //...
    out:
    return a ;
}
1
Убежденный
Системный программист
Эксперт С++
15550 / 7058 / 1114
Регистрация: 02.05.2013
Сообщений: 11,468
Завершенные тесты: 1
14.07.2014, 23:26 #13
Цитата Сообщение от orange_fox Посмотреть сообщение
Если у вас есть вариант получше, то продемонстрируйте его)
Конечно есть !
Дать "func" и "a" осмысленные имена, соответствующие их назначению.
Это будет полезнее, чем заниматься мазохизмом под названием "найди среди
1024 способов расстановки скобочек один истинно верный".
2
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6471 / 3119 / 306
Регистрация: 04.12.2011
Сообщений: 8,594
Записей в блоге: 4
15.07.2014, 01:06 #14
Цитата Сообщение от orange_fox Посмотреть сообщение
C++
1
bool func(int a) { if (a == 0) return false; /* Тут код строчек на 10 - 15 */ return true; }
orange_fox, моё мнение, - если параметр сразу определяет выполнять или нет, то лучше не зашивать его в функцию, а проверяя условие в точке возможного вызова принимать решение. Тогда в коде это будет читаемо и информативно. Другое дело, если само условие получает значение внутри функции и выделить код в отдельную маленькую булеву функцию не получается.
Охваченный общим порывом напишу:
C++
1
2
3
4
5
6
7
 bool func(int a){ 
while (a){ 
 /* Тут код строчек на 10 - 15 */
return 1;
}
return 0; 
}
Форма превыше содержания.
0
SatanaXIII
Супер-модератор
Эксперт С++
5616 / 2651 / 246
Регистрация: 01.11.2011
Сообщений: 6,529
Завершенные тесты: 1
15.07.2014, 09:42 #15
Все равно все эти ухищрения раскроются в goto так что Croessmah верно говорит: тут вам и один выход из функции, и читабельность отличная, и Убежденный прав - все это оптимизируется все равно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2014, 09:42
Привет! Вот еще темы с ответами:

Какой С++ лучше? - C++
Подскажите, какой С++ лучше выбрать для изучения. Я имею 2 книги: "Освой самостоятельно С++ за 21 день" 2010 год и "С++ Шаг за шагом" 2010...

Какой лучше комрилятор? - C++
Прошу извинения сразу. Тема заезженная .Какой компилятор лучше ? И какую версию компилятора выбирать анг. или русск.?

Как узнать, какой функции какой файл *.a соответсвует? - C++
Друзья! Работаю с mingw, вот там надо так: если, допустим, вызываешь API- функцию, то надо подключать соответствующую библиотеку (?),...

Какой структурой лучше пользоваться? - C++
Есть короче ряд объектов. Из них надо удалить одинаковые. Куда их лучше занести в vector? list? Или что еще?


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.07.2014, 09:42
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru