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

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

Восстановить пароль Регистрация
 
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
14.07.2014, 17:36     Какой вариант оформления функции лучше? #1
Допустим, есть функция, которая что-то делает и, возвращает булево значение, в зависимости от того, получилось это сделать или нет.

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;
}
Если у вас есть вариант получше, то продемонстрируйте его)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Тамика
Котовчанин
 Аватар для Тамика
859 / 439 / 129
Регистрация: 16.02.2010
Сообщений: 2,538
Записей в блоге: 27
14.07.2014, 17:41     Какой вариант оформления функции лучше? #2
C++
1
2
3
4
bool func(int a)
{
    return a;
}
Добавлено через 55 секунд
Но это если совсем в лоб.
orange_fox
 Аватар для orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
14.07.2014, 21:41  [ТС]     Какой вариант оформления функции лучше? #3
Тамика, Не, нолик я чисто для примера взял.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 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;
}
soon
 Аватар для soon
2536 / 1301 / 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 секунд
Ать, почти успел
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
14.07.2014, 22:02     Какой вариант оформления функции лучше? #6
orange_fox, а я скажу, что правило "один выход из функции" совсем не актуально для С++. Оно было актуально для ассемблера и в старые времена, когда компиляторы не умели нормально оптимизировать код.
Код должен отражать алгоритм. Как можно более ясно. Если мы впихиваем в наш алгоритм какие-то лишние переменные лишь только затем, чтобы соответствовать некоему правилу, то, ИМХО, это больше похоже на культ.

ЗЫ. Вышеотписавшиеся, прошу вас не устраивать холивар со мной на эту тему. Пусть ТС сам решает.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.07.2014, 22:06     Какой вариант оформления функции лучше? #7
Цитата Сообщение от soon Посмотреть сообщение
Старайтесь придерживаться правила "один выход из функции"
Это вопрос скорее холиварный, чем научный. Предлагаю посмотреть ещё на ацкий вариант:
C++
1
2
3
4
5
6
7
bool func( int a )
{
    return a ? 
        // несколько строк, но разделять надо запятой
        true
    : false;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
14.07.2014, 22:10     Какой вариант оформления функции лучше? #8
Цитата Сообщение от DrOffset Посмотреть сообщение
Оно было актуально для ассемблера и в старые времена, когда компиляторы не умели нормально оптимизировать код.
[не холивара ради] На самом деле нет. Оптимизация тут ни при чем, тут вопрос читабельности. Программист, читая твой код, будет инстинктивно искать return в конце функции и хорошо если это будет единственный return на все тело ф-ции. В противном случае есть шанс, что он пропустит один из многих return'ов. В некоторых случаях, бесспорно, много return'ов не влияют на читабельность и понимание кода, но в больших функциях это правило очень полезно. Вот здесь есть хорошие примеры, когда это на руку.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.07.2014, 22:12     Какой вариант оформления функции лучше? #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
но в больших функциях это правило очень полезно.
Вот поэтому больших функций быть и не должно.
Mr.X
Эксперт С++
 Аватар для Mr.X
2807 / 1583 / 248
Регистрация: 03.05.2010
Сообщений: 3,691
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;
}
DrOffset
6461 / 3835 / 886
Регистрация: 30.01.2014
Сообщений: 6,630
14.07.2014, 22:21     Какой вариант оформления функции лучше? #11
Все таки холивар .

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

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

Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот здесь есть хорошие примеры, когда это на руку.
В некоторых примерах по этой ссылке противопоставляется хороший код с выносом return в конец функции и плохой код с несколькими return в середине. Чтобы было ясно, я не выступаю против подхода "return в конце" когда это целесообразно. Я лишь против культов.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 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 ;
}
Убежденный
Системный программист
 Аватар для Убежденный
14216 / 6231 / 988
Регистрация: 02.05.2013
Сообщений: 10,390
Завершенные тесты: 1
14.07.2014, 23:26     Какой вариант оформления функции лучше? #13
Цитата Сообщение от orange_fox Посмотреть сообщение
Если у вас есть вариант получше, то продемонстрируйте его)
Конечно есть !
Дать "func" и "a" осмысленные имена, соответствующие их назначению.
Это будет полезнее, чем заниматься мазохизмом под названием "найди среди
1024 способов расстановки скобочек один истинно верный".
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,722
Записей в блоге: 3
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; 
}
Форма превыше содержания.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
15.07.2014, 09:42     Какой вариант оформления функции лучше? #15
Все равно все эти ухищрения раскроются в goto так что Croessmah верно говорит: тут вам и один выход из функции, и читабельность отличная, и Убежденный прав - все это оптимизируется все равно.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
15.07.2014, 11:10     Какой вариант оформления функции лучше? #16
Сам предпочитаю вариант номер 3.

В наличии нескольких возвратов из функции не вижу ничего страшного если все они ближе к началу и к концу функции. return'ы в середине функции это уже не очень, но в принципе не фатально.

Почему именно 3-ий вариант? Не нужна лишняя вложенность для основного куска кода. Сразу видны предусловия функции. Сразу видно к чему приводит (не)выполнение условия
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.07.2014, 11:28     Какой вариант оформления функции лучше?
Еще ссылки по теме:

C++ Какой вариант более оптимальный?
C++ Какой лучше комрилятор?
Какой отладчик лучше использовать? C++

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

Или воспользуйтесь поиском по форуму:
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
15.07.2014, 11:28     Какой вариант оформления функции лучше? #17
Третий. Только return false на отдельную строку и отделить пустой строкой от остального.

Добавлено через 1 минуту
Про return внутри функции - это нормально. Времена, когда были проблемы с отладкой такого кода, давно прошли.
Yandex
Объявления
15.07.2014, 11:28     Какой вариант оформления функции лучше?
Ответ Создать тему
Опции темы

Текущее время: 15:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru