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

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

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

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

14.07.2014, 17:36. Просмотров 579. Ответов 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;
}
Если у вас есть вариант получше, то продемонстрируйте его)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Тамика
Котовчанин
867 / 447 / 135
Регистрация: 16.02.2010
Сообщений: 2,752
Записей в блоге: 27
14.07.2014, 17:41     Какой вариант оформления функции лучше? #2
C++
1
2
3
4
bool func(int a)
{
    return a;
}
Добавлено через 55 секунд
Но это если совсем в лоб.
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
14.07.2014, 21:41  [ТС]     Какой вариант оформления функции лучше? #3
Тамика, Не, нолик я чисто для примера взял.
Kastaneda
Форумчанин
Эксперт С++
4263 / 2795 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 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
2537 / 1302 / 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
6841 / 4052 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
14.07.2014, 22:02     Какой вариант оформления функции лучше? #6
orange_fox, а я скажу, что правило "один выход из функции" совсем не актуально для С++. Оно было актуально для ассемблера и в старые времена, когда компиляторы не умели нормально оптимизировать код.
Код должен отражать алгоритм. Как можно более ясно. Если мы впихиваем в наш алгоритм какие-то лишние переменные лишь только затем, чтобы соответствовать некоему правилу, то, ИМХО, это больше похоже на культ.

ЗЫ. Вышеотписавшиеся, прошу вас не устраивать холивар со мной на эту тему. Пусть ТС сам решает.
Tulosba
:)
Эксперт С++
4387 / 3230 / 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
Форумчанин
Эксперт С++
4263 / 2795 / 219
Регистрация: 12.12.2009
Сообщений: 7,122
Записей в блоге: 1
Завершенные тесты: 1
14.07.2014, 22:10     Какой вариант оформления функции лучше? #8
Цитата Сообщение от DrOffset Посмотреть сообщение
Оно было актуально для ассемблера и в старые времена, когда компиляторы не умели нормально оптимизировать код.
[не холивара ради] На самом деле нет. Оптимизация тут ни при чем, тут вопрос читабельности. Программист, читая твой код, будет инстинктивно искать return в конце функции и хорошо если это будет единственный return на все тело ф-ции. В противном случае есть шанс, что он пропустит один из многих return'ов. В некоторых случаях, бесспорно, много return'ов не влияют на читабельность и понимание кода, но в больших функциях это правило очень полезно. Вот здесь есть хорошие примеры, когда это на руку.
Tulosba
:)
Эксперт С++
4387 / 3230 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.07.2014, 22:12     Какой вариант оформления функции лучше? #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
но в больших функциях это правило очень полезно.
Вот поэтому больших функций быть и не должно.
Mr.X
Эксперт С++
3039 / 1684 / 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;
}
DrOffset
6841 / 4052 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
14.07.2014, 22:21     Какой вариант оформления функции лучше? #11
Все таки холивар .

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

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

Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот здесь есть хорошие примеры, когда это на руку.
В некоторых примерах по этой ссылке противопоставляется хороший код с выносом return в конец функции и плохой код с несколькими return в середине. Чтобы было ясно, я не выступаю против подхода "return в конце" когда это целесообразно. Я лишь против культов.
Croessmah
Модератор
Эксперт CЭксперт С++
12730 / 7190 / 802
Регистрация: 27.09.2012
Сообщений: 17,738
Записей в блоге: 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 ;
}
Убежденный
Системный программист
Эксперт С++
14908 / 6726 / 1059
Регистрация: 02.05.2013
Сообщений: 11,008
Завершенные тесты: 1
14.07.2014, 23:26     Какой вариант оформления функции лучше? #13
Цитата Сообщение от orange_fox Посмотреть сообщение
Если у вас есть вариант получше, то продемонстрируйте его)
Конечно есть !
Дать "func" и "a" осмысленные имена, соответствующие их назначению.
Это будет полезнее, чем заниматься мазохизмом под названием "найди среди
1024 способов расстановки скобочек один истинно верный".
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6366 / 3013 / 297
Регистрация: 04.12.2011
Сообщений: 8,110
Записей в блоге: 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
Супер-модератор
Эксперт С++
5580 / 2614 / 239
Регистрация: 01.11.2011
Сообщений: 6,428
Завершенные тесты: 1
15.07.2014, 09:42     Какой вариант оформления функции лучше? #15
Все равно все эти ухищрения раскроются в goto так что Croessmah верно говорит: тут вам и один выход из функции, и читабельность отличная, и Убежденный прав - все это оптимизируется все равно.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,338
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++ Какой графический интерфейс лучше выбрать
C++ Какой структурой лучше пользоваться?
C++ Какой язык лучше изучать C# или C++

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

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

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

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