Russian Qt Forum
Май 06, 2024, 09:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: [флэйм] if(expr) return 1; else return 0;  (Прочитано 34361 раз)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #15 : Февраль 15, 2009, 17:43 »

зачем return else return?

возможно просто таков стиль программирования, хз. Впринципе, else return, невредит, но и не помогает. Лично я подобную конструкцию не использую. Лишняя вложенность никчему.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #16 : Февраль 15, 2009, 17:45 »

не, изначально был общий случай типа if(i==10)

Код
C++ (Qt)
return (i==10);

Ы? Подмигивающий
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #17 : Февраль 15, 2009, 18:09 »

Затем, что в них видно, какие варианты результата работы функции возможны.

Нас интересует один результат: ИНТИНА или ЛОЖЬ. Все.

В случае "return exp;" читащему код еще надо разглядеть ... Хорошо, если функция короткая. А если заголовок уехал за экран, то правильно понять такую конструкцию сложнее, чем явное условие.

вот здесь совершенно непонял мысли. Если при записи:

Код
C++ (Qt)
return <очень длинное выражение>;

читающему нужно разглядывать код, а при

Код
C++ (Qt)
if (<тоже самое очень длинное выражение>) {}

разглядывать ничего не нужно?

Накрайняк, как уже предлагали, можно воспользоваться тернарной операцией.

...что выражение не вычисляется по какой-то формуле как математическое выражение, а является логическим выражением.

Вас смущают мат выражения в качестве условия? Или что имелось ввиду?
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #18 : Февраль 15, 2009, 20:18 »

вот здесь совершенно непонял мысли. Если при записи:

Код
C++ (Qt)
return <очень длинное выражение>;

читающему нужно разглядывать код, а при

Код
C++ (Qt)
if (<тоже самое очень длинное выражение>) {}

разглядывать ничего не нужно?

Именно. Смысл ключевого слова return - возвратить вычисленное в функции значение. Если вы после return начинаете вычислять выражение - вы последовательное чтение кода разрываете - по факту, заставляете читать ваш код задом-наперёд. Учитывая, что написание кода - это взаимодействие человека с машиной, вы это взаимодействие несознательно (или сознательно) ухудшаете.
Записан

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #19 : Февраль 15, 2009, 20:30 »

Это все очень не убедительно, если не сказать смешно (не хочу тебя обидеть, но это больше похоже на "не могу это понять, значит это плохо и я использовать не буду.")
Что там понимать в конструкции выбора? Я тебе примеры приводил, не понимая как они работают чтоли?

Я правильно понял, что по твоему мнению операция выбора добавленна в язык специально для функций вывода?
Неправильно, ибо выше я написал - "Грубо говоря, конструкция выбора предназначена для вычисления на лету отправляемых в функцию значений. Бывают ситуации, когда это может быть полезно, хотя лучше вычисление все же выносить вперед перед вызовом функции для наглядности".

Если нет, то объясни почему нельзя использовать return (expr)? variant1 : variant2; или var = (expr)? variant1 : variant2;
Уже объяснил. Могу скопипастить мессагу с объяснением в личку, почитаешь на досуге Улыбающийся

У меня и первое выражение не вызвало затруднений ( хоть там и добущенна ошибка), а такая конструкция у тебя вызывает затруднения?
Код
C++ (Qt)
if( !LC && !RC )
child = 0;
else
child = ( !LC )? RC : LC;
 

Да, потому что в ней необоснованное смешение стилей (оператор условия и оператор выбра), да заодно и отрицание в связке с логическим И в операторе if, которое в естественной форме лучше записать как if(LC==false && RC==false) или if(LC==0 && RC==0).
Записан

Собираю информацию по крупицам
http://webhamster.ru
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #20 : Февраль 15, 2009, 20:34 »

Именно. Смысл ключевого слова return - возвратить вычисленное в функции значение. Если вы после return начинаете вычислять выражение - вы последовательное чтение кода разрываете - по факту, заставляете читать ваш код задом-наперёд. Учитывая, что написание кода - это взаимодействие человека с машиной, вы это взаимодействие несознательно (или сознательно) ухудшаете.

Т.е. если я имею у себя код:

Код
C++ (Qt)
int a = <выражение>;
return (a != 0);

или

Код
C++ (Qt)
return <выражение> != 0;

я всегда, согласно вашему стилю? должен писать так:

Код
C++ (Qt)
int a = <выражение>;
bool b = (a !=0);
return b;

Да?

Очень странное суждение.... Но, как говорится, на вкус и цвет...

имхо, это все зависит от "собственной стилистики" или "плохого или неполного понимания работы некоторый операторов" или "малого опыта программирования". Также возможно тежелое наследие другого языка, например Pascal
« Последнее редактирование: Февраль 15, 2009, 20:43 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #21 : Февраль 15, 2009, 20:43 »

...что выражение не вычисляется по какой-то формуле как математическое выражение, а является логическим выражением.

Вас смущают мат выражения в качестве условия? Или что имелось ввиду?

Имелось в виду, что если выражение оформлено внутри оператора if(), мы автоматически знаем, что это выражение логическое.

Если выражение оформлено просто в коде, или в каком-то операторе типа return, мы предполагаем, что выражение математическое (хотя оно и может возвращать бинарное (логическое) значение типа 0 или 1). Поэтому, вставка оператора "?:" в return заставляет читающего код разгребать, что имел в виду аффтар. Хотя бы потому, что "?:" можно вставить в математическое выражение, и читаещему нужно визуально четко определить границы "?:", и выяснить присходят ли за этими границами какие-то еще вычисления. Посему, использование "?:" в return (да и в других неуместных местах), с точки зрения человеческой психологии, порождает много неоднозначностей. Если учитывать, что человек не идеален, он может быть уставшим, может торопиться, то использование таких конструкций повышает вероятность появления ошибок.
Записан

Собираю информацию по крупицам
http://webhamster.ru
Khs
Гость
« Ответ #22 : Февраль 15, 2009, 20:58 »

Лично мне кажется, что тему лучше закрыть, ибо на вкус и цвет товарищей нет.  В замешательстве
Записан
BRE
Гость
« Ответ #23 : Февраль 15, 2009, 21:05 »

Очень странное суждение.... Но, как говорится, на вкус и цвет...

имхо, это все зависит от "собственной стилистики" или "плохого или неполного понимания работы некоторый операторов" или "малого опыта программирования". Также возможно тежелое наследие другого языка, например Pascal
+1000

2 xintrea
Вопросов больше не имею.
От комплексов лучше избавляться в самом начале, иначе затянут.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #24 : Февраль 15, 2009, 21:28 »

xintrea, в каждом правиле есть исключения. Твои суждения справедливы для очень сложных выражений. (и то при некоторыйх условиях лучше инкапсулировать в функцию).

Но если вырежение пустиковое, зачем перегружать код лишними операторами, городить доп. уровни вложенности?

Например, ты утверждаешь, что использование тернарной операции это плохо, что в ней трудно разобратся. Здесь я несогласен. Это прекрасная операция, от которой нестоит отказыватся. Нужно использовать весь функционал языка.

Например из этих выражений, я предпочитаю последнее и я недумаю что оно кого-то запутает:

Код
C++ (Qt)
if (a>b)
  return a;
else
 return b;

Код
C++ (Qt)
if (a>b)
 return a;
return b;

Код
C++ (Qt)
return (a>b ? a : b);

согласен с  log1c, мы отклонились от темы и перешли в плоскость личныъ предпочтений.
« Последнее редактирование: Февраль 15, 2009, 21:30 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
ритт
Гость
« Ответ #25 : Февраль 15, 2009, 21:56 »

Лично мне кажется, что тему лучше закрыть, ибо на вкус и цвет товарищей нет.  В замешательстве
не, пусть будет. как `null vs 0`...

xintrea направил тему несколько в иное русло, а на первоначальный вопрос в итоге никто из преверженцев такого стиля письма так и не ответил.
повторюсь более развёрнуто:
функция возвращает значение. запись
Код:
    //...
    if(!something.isValid())
        return false;
    else
        return something;
}
мне лично первым делом подсказывает, что выражение неокончено (возможно, перед фигурной скобкой не хватает отступов или нужно внимательнее читать код выше). такое впечатление складывается из-за уверенности, что функция возвращает значение, а я не вижу _явного_ возврата значения для случая, когда ни одно из условий не выполняется. и только приглядевшись уже, видишь, что это было последнее(финальное) условие и последняя строка и есть результирующее значение. т.о. время на чтения исходника резко увеличивается, т.к. необходимо остановить взгляд в таких местах...это как при чтении, например, баша - вроде и по-русски написано, а порой только с третьего раза понимаешь _что_ написано.
Записан
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #26 : Февраль 15, 2009, 22:00 »

Т.е. если я имею у себя код:
Код
C++ (Qt)
int a = <выражение>;
return (a != 0);
или
Код
C++ (Qt)
return <выражение> != 0;

Вы сейчас превелии классические примеры того, как писать ненадо. Вы искажаете логику последовательного изложения алгоритма (ибо семантика языков с C-подобным синтаксисом
http://ru.wikipedia.org/wiki/C-%D0%BF%D0%BE%D0%B4%D0%BE%D0%B1%D0%BD%D1%8B%D0%B9_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81 и C-подобная система обозначений логических конструкций, предназначена для последовательного декларирования логики алгоритма, а не задом-наперёд).

Ваше стремление сделать вычисление внутри операции возврата значения, или любительство использовать в return оператора "?:" тяготеет к функциональному стилю программирования, для которого синтаксис C/C++ не предназначен (хотя подобие можно написать). Базовый синтаксис C предназначен для обычного процедурного программирования http://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%86%D0%B5%D0%B4%D1%83%D1%80%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5.


я всегда, согласно вашему стилю должен писать так:

Код
C++ (Qt)
int a = <выражение>;
bool b = (a !=0);
return b;

Да? Очень странное суждение.... Но, как говорится, на вкус и цвет... имхо, это все зависит от "собственной стилистики" или "плохого или неполного понимания работы некоторый операторов" или "малого опыта программирования". Также возможно тежелое наследие другого языка, например Pascal

Это не мой стиль, а элементарная логика. Кстати, ваш код неудачен, по-хорошему надо написать

Код
C++ (Qt)
if(<выражение>==0)return false;
else return true;

Что неправильного в вашем коде? Необоснованное использование двух переменных - a и b, плюс вычисление с логическим отрицанием b = (a !=0), которое я три минуты пока меня тут отвлекали, переводил на человеческий язык.


Вообще, честногря я удивлен, что люди, которые хорошо осилили синтаксис C/C++, ООП и Qt, и вроде как сопровождали более-менее крупные проекты, пишут здесь такие глупости... Я даже не знаю, какие еще доводы привести, что писать нужно не "на языке", а "с использованием" языка. Ну разве что только посоветовать книжки Маркконнелла или там Кернигана почитать.

Ну сделаю еще одну попытку... Как и в человеческих языках, в языках программирования существуют устойчивые конструкции - так называемые идиомы - т.е. стандартные варианты реализации распространённых операций. Главное в изучении любого языка - это как следует ознакомиться с ситемой его идиом, и правильно их применять. А система идеом естественным образом складывается из парадигмы языка.

Вот простой пример - почему так популярны регулярные выражения для обработки текста? Даже несмотря на то, что синтаксис регвыров ужасен и неудобен даже для тех, кто этими регвырами постоянно пользуется? Текст ведь можно с тем же успехом обработать и традиционными функциями в любом языке программирования. Зачем тогда нужны регвыры?

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

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

Собираю информацию по крупицам
http://webhamster.ru
xintrea
Супер активный житель
*****
Offline Offline

Сообщений: 754



Просмотр профиля WWW
« Ответ #27 : Февраль 15, 2009, 22:15 »

Код:
    //...
    if(!something.isValid())
        return false;
    else
        return something;
}

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

Записан

Собираю информацию по крупицам
http://webhamster.ru
ритт
Гость
« Ответ #28 : Февраль 15, 2009, 22:17 »

учту. не буду читать твой код.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #29 : Февраль 15, 2009, 22:20 »

Кстати, ваш код неудачен...

Что неправильного в вашем коде? Необоснованное использование двух переменных - a и b, плюс вычисление с логическим отрицанием b = (a !=0), которое я три минуты пока меня тут отвлекали, переводил на человеческий язык.

Сума сойти! Это не мой код! Я так никогда не писал, не пишу и писать не буду. Я код привел чисто для примера, не больше не меньше.
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.33 секунд. Запросов: 22.