Russian Qt Forum

Программирование => Общий => Тема начата: ритт от Февраль 11, 2009, 05:26



Название: [флэйм] if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 11, 2009, 05:26
[off]
всегда хотел узнать почему люди так пишут
Код:
    if (expr) {
        return 1;
    } else {
        return 0;
    }

раньше думал, что это отличительная черта пыхпыхеров, теперь сомневаюсь...
[/off]


Название: if(expr) return 1; else return 0;
Отправлено: AAXEE от Февраль 12, 2009, 21:56
[off]
А что не так?
Или Вы имеете ввиду, что быстрее написать так?
Код:
return exp ;
[/off]


Название: if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 13, 2009, 04:25
[off]
не...
зачем return else return?
[/off]


Название: if(expr) return 1; else return 0;
Отправлено: BRE от Февраль 13, 2009, 08:19
[off]
не...
зачем return else return?
[/off]
[off]
+ для таких конструкций есть:
return (expr)? variant1 : variant2;
[/off]


Название: if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 13, 2009, 09:07
[off]
+ для таких конструкций есть:
return (expr)? variant1 : variant2;
[/off]
[off]
я об этом же.
ну, или хотя бы if() return; return;
а так только путает, когда читаешь код с кучей таких фейковых элсов...
[/off]


Название: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 14, 2009, 02:27
Код:
    if (expr) {
        return 1;
    } else {
        return 0;
    }

Очень красивый и понятный код. Фигурные скобки, конечно, лишние, но код практически человеческим языком описывает логику своей работы.

Так и нужно писать, без всяких "return (expr)? variant1 : variant2;", ибо конструкция "()?:" предназначена совсем для других случаев.


Название: if(expr) return 1; else return 0;
Отправлено: BRE от Февраль 14, 2009, 12:16
Так и нужно писать, без всяких "return (expr)? variant1 : variant2;", ибо конструкция "()?:" предназначена совсем для других случаев.
Поясни, пожалуйста.  ;)
Или это просто комплексы?


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 14, 2009, 16:02
Или Вы имеете ввиду, что быстрее написать так?
Код:
return exp ;

В данном случае я бы так и написал. Зачем лишние конструкции if/else?


Название: Re: if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 14, 2009, 16:20
не, изначально был общий случай типа if(i==10)
просто тему отделил (много оффа собралось) и теперь контекст неоднозначен...


Название: Re: if(expr) return 1; else return 0;
Отправлено: spirit от Февраль 14, 2009, 17:13
[off]
всегда хотел узнать почему люди так пишут
Код:
    if (expr) {
        return 1;
    } else {
        return 0;
    }

раньше думал, что это отличительная черта пыхпыхеров, теперь сомневаюсь...
[/off]
индуским стилем попахивает :) никого обидеть не хотел.


Название: Re: if(expr) return 1; else return 0;
Отправлено: lit-uriy от Февраль 14, 2009, 18:21
я иногда тоже так пишу, когда планрую какую-нибудь работу делать до return'а, но пока не реализовано пусть хотябы компилится.


Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 15, 2009, 01:27
Так и нужно писать, без всяких "return (expr)? variant1 : variant2;", ибо конструкция "()?:" предназначена совсем для других случаев.
Поясни, пожалуйста.  ;)
Или это просто комплексы?

Операция выбора "()?:" следует использовать для избежания дублирования кода. Например, ее можно использовать внутри вызовов печати (всякие printf). Например, если требуется при нуле выводить строку, а при наличие числа просто печатать это число, то вместо конструкции

Код:
if(i==0)
 printf("Количество найденых объектов: %d Внимание! Объекты не найдены",i);
else
 printf("Количество найденых объектов: %d",i);

Можно воспользоваться конструкцией

Код:
printf("Количество найденых объектов: %d %s",i, i==0 ? "" : "Внимание! Объекты не найдены");

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


Еще, пара мыслей из книги "Практика программирования".

Цитировать
Некоторые конструкции, кажется, просто обречены на злоупотребление. Именно такова операция выбора по условию "?:", с помощью которой можно построить довольно загадочные выражения:

Код:
child=(!LC&&!RC)0:(!LC?RC:LC);

Следующая форма значительно длиннее, но понять ее гораздо легче, потому что эти альтернативы более очевидны:

Код:
if(LC==0 && RC==0) 
 child=0;
else
 if(LC==0)
  child=RC;
 else
  child=LC;

В целом, операцию выбора по условию нельзя считать равноценным заменителем условного оператора.

Цитировать
Записывайте выражения в естественной форме. Следует писать выражения так же, как бы вы читали их вслух. В этом смыле, условные операторы, написанные синтаксически правильно, но содержащие операцию отрицания, всегда труднее понять, особенно если используется составное условие со связками И/ИЛИ. Лучше использовать утвердительную форму проверок, например, заменив знак проверки "больше" на "меньше".

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

Цитировать
Понятность кода - это совсем не то же самое, что его краткость. Довольно часто более понятный код является в то же время более кратким. С другой стороны, он может быть и более длинным, как в примере с заменой операции выбора по условию операторами if - else. Критерием выбора тут является легкость понимания кода.



Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 15, 2009, 01:53
Или Вы имеете ввиду, что быстрее написать так?
Код:
return exp ;
В данном случае я бы так и написал. Зачем лишние конструкции if/else?

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: Rcus от Февраль 15, 2009, 10:44
Примерчик порадовал :)
Код:
child=(!LC&&!RC)0:(!LC?RC:LC);
слишком пессимистично
Код:
child = (LC || RC) ? (LC ? LC : RC) : 0;
оптимистичнее и понятнее :) даже если сравнивать с if/else
а еще можно так:
Код:
child = LC ? LC : (RC ? RC : 0);


Название: Re: if(expr) return 1; else return 0;
Отправлено: BRE от Февраль 15, 2009, 10:47
Операция выбора "()?:" следует использовать для избежания дублирования кода. Например, ее можно использовать внутри вызовов печати (всякие printf).
Это все очень не убедительно, если не сказать смешно (не хочу тебя обидеть, но это больше похоже на "не могу это понять, значит это плохо и я использовать не буду.")
Я правильно понял, что по твоему мнению операция выбора добавленна в язык специально для функций вывода?
Если нет, то объясни почему нельзя использовать return (expr)? variant1 : variant2; или var = (expr)? variant1 : variant2;


Код:
if(LC==0 && RC==0) 
 child=0;
else
 if(LC==0)
  child=RC;
 else
  child=LC;

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 15, 2009, 17:43
зачем return else return?

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 15, 2009, 17:45
не, изначально был общий случай типа if(i==10)

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

Ы? ;)


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 15, 2009, 18:09
Затем, что в них видно, какие варианты результата работы функции возможны.

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

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

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

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

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

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

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

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

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

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 15, 2009, 20:18
вот здесь совершенно непонял мысли. Если при записи:

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

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

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

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

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 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).


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 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


Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 15, 2009, 20:43
...что выражение не вычисляется по какой-то формуле как математическое выражение, а является логическим выражением.

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

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

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: Khs от Февраль 15, 2009, 20:58
Лично мне кажется, что тему лучше закрыть, ибо на вкус и цвет товарищей нет.  :-\


Название: Re: if(expr) return 1; else return 0;
Отправлено: BRE от Февраль 15, 2009, 21:05
Очень странное суждение.... Но, как говорится, на вкус и цвет...

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

2 xintrea
Вопросов больше не имею.
От комплексов лучше избавляться в самом начале, иначе затянут.


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 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, мы отклонились от темы и перешли в плоскость личныъ предпочтений.


Название: Re: if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 15, 2009, 21:56
Лично мне кажется, что тему лучше закрыть, ибо на вкус и цвет товарищей нет.  :-\
не, пусть будет. как `null vs 0`...

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 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 (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 (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++, систему идиом можно считать системой обозначений. Если система используемых идеом сконструирована правильно, и код написан с учетом такой системы, то его легко понимать и сопровождать. Если в коде использовать конструкции, выбивающиеся из системы идеом - код хоть и синтаксически правилен, но становится труден для восприятия и сопровождения.


Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 15, 2009, 22:15
Код:
    //...
    if(!something.isValid())
        return false;
    else
        return something;
}

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



Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 15, 2009, 22:17
учту. не буду читать твой код.


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 15, 2009, 22:20
Кстати, ваш код неудачен...

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

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


Название: Re: if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 15, 2009, 22:28
по-хорошему надо написать

А где это так сказано? Кто так пишет? Кто так говорит что так нужно?


Название: Re: if(expr) return 1; else return 0;
Отправлено: Khs от Февраль 15, 2009, 22:30
Лично мне кажется, что тему лучше закрыть, ибо на вкус и цвет товарищей нет.  :-\
не, пусть будет. как `null vs 0`...

ага, и как Qt vs .NET, там аж на 9 страниц развили тему :)


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 15, 2009, 22:50
Лично мне кажется, что тему лучше закрыть, ибо на вкус и цвет товарищей нет.  :-\
не, пусть будет. как `null vs 0`...

ага, и как Qt vs .NET, там аж на 9 страниц развили тему :)
ну и что? было бы неинтересно, давно тему снесли бы. а так там даже две темы слеплено в кучку :)

зы. кстати, на вкус и цвет товарищи есть :)


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: Khs от Февраль 15, 2009, 22:58
зы. кстати, на вкус и цвет товарищи есть :)

Ну это как сказать, ведь никем не доказано что два разных человека одинаково чувствуют и видят одно и то же :) А следовательно и не факт, что им нравится одно и то же :)

Хы..теперь в этом топике тоже несколько рассуждений :)


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 15, 2009, 23:01
xintrea, так, ради интереса, загляни в исходники в Qt и напиши письмо в Qt Software, мол "ай-я-яй, вы тут все каноны стилистики и С++ ломаете, куда же этогодится так писать":

Код
C++ (Qt)
bool QWidget::autoFillBackground() const
{
   return d->extra && d->extra->autoFillBackground;
}

Код
C++ (Qt)
QInputContext *QWidget::inputContext()
{
   if (!testAttribute(Qt::WA_InputMethodEnabled))
       return 0;
 
   return d->inputContext();
}

И тернарные операции используете:

Код
C++ (Qt)
extra->explicitMinSize = (minw ? Qt::Horizontal : 0) | (minh ? Qt::Vertical : 0);

Код
C++ (Qt)
Qt::LayoutDirection QWidget::layoutDirection() const
{
   return testAttribute(Qt::WA_RightToLeft) ? Qt::RightToLeft : Qt::LeftToRight;
}

А этот код вобще кошмар:

Код
C++ (Qt)
QCursor QWidget::cursor() const
{
   if (testAttribute(Qt::WA_SetCursor))
       return (d->extra && d->extra->curs)
           ? *d->extra->curs
           : QCursor(Qt::ArrowCursor);
   if (isWindow() || !parentWidget())
       return QCursor(Qt::ArrowCursor);
   return parentWidget()->cursor();
}

ужос!


Название: Re: if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 15, 2009, 23:14
по-хорошему надо написать
А где это так сказано? Кто так пишет? Кто так говорит что так нужно?

В книжках это сказано. К сожалению, в электронном виде не могу найти, а то бы ссылки дал. Называются "Практика программирования" товарищей Кернигана и Пайка, и "Совершенный код" товарища Маркконнелла. Кстати там не только то что тут обсуждаем пишут. Там заодно и советы по стилю форматирования есть, причем не на пустом месте, или "потому что так красиво", или "потому что тут так принято", а на нескольких страницах с диаграммами структуры кода. Я тут эту тему вообще боюсь поднимать, ибо чую что получица холивар шояипу.


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 15, 2009, 23:42
xintrea, так, ради интереса, загляни в исходники в Qt и напиши письмо в Qt Software, мол "ай-я-яй, вы тут все каноны стилистики и С++ ломаете, куда же этогодится так писать"

ужос!

Ужос налицо.

Вы же не хотите сказать что "коль даже в Qt пишут уродливый код, так и я тоже буду всё уродовать"? Если видишь откровенное уродство, чего на него равняться?


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 15, 2009, 23:53
я вот вижу откровенное уродство в коде, который приводил выше - на него и не равняюсь.
с моей точки зрения если сказал, что вернёшь данные, чётко покажи, что возвращаешь их в любом случае, а не если что-то там "да", что-то "нет", а в противном случае "вот". хотя бы не вписывай этот горемычный "else" - уже будет сходу видно, что значение всяко возвращается...


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: Rcus от Февраль 16, 2009, 07:43
Не помню в CC высказываний о вреде тернарного оператора или наставлений о единственно верном стиле программирования. Помню только что в начале главы о форматировании кода есть знак предупреждения о священных войнах :) Макконнелл больше говорит о снижении сложности через снижение вложенности


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: kuzulis от Февраль 16, 2009, 08:54
2 xintrea,
+ пицот тыщ !  :)

остальные - нечаво выпендривацца! :)


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 16, 2009, 12:40
Ужос налицо.

Вопрос снят...


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 16, 2009, 12:41
2 xintrea,
+ пицот тыщ !  :)

остальные - нечаво выпендривацца! :)

Молодца! Аргументируй давай!


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: kuzulis от Февраль 16, 2009, 13:10
Аргументирую:
исхожу из сугубо эстетических взглядов. Зачем писать нечто подобное:
Код:
QCursor QWidget::cursor() const
{
    if (testAttribute(Qt::WA_SetCursor))
        return (d->extra && d->extra->curs)
            ? *d->extra->curs
            : QCursor(Qt::ArrowCursor);
    if (isWindow() || !parentWidget())
        return QCursor(Qt::ArrowCursor);
    return parentWidget()->cursor();
}

???
т.к в таком случае еще более нагружается мозг и без того нагруженный! зачем усложнять и без того сложную жизнь?! :)

и в конечном счете ведь впринципе эта запись (ну и аналогичные ей) не дают никаких плюсов при работе приложения (ИМХО)

нужно писать код - как стих в литературе! чтобы было легко его читать! без всяких там подвыподвертов!




Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: BRE от Февраль 16, 2009, 13:13
нужно писать код - как стих в литературе! чтобы было легко его читать! без всяких там подвыподвертов!
Перепиши пожалуйста эту функция так, как написал бы ее сам.


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: kuzulis от Февраль 16, 2009, 13:15
Я не умею! Я только учусь! :)

Ага, ща все брошу и буду фигней заниматься (с) :)


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: Rcus от Февраль 16, 2009, 13:44
Код
C++ (Qt)
QCursor result;
if (testAttribute(Qt::WA_SetCursor)) {
   if (d->extra && d->extra->curs) {
       result = *d->extra->curs;
   } else {
       resut = QCursor(Qt::ArrowCursor);
   }
} else if (isWindow() || !parentWidget()) {
   result = QCursor(Qt::ArrowCursor);
} else {
   result = parentWidget()->cursor();
}
return result;
что-то забыл... ах да, MUAHAHAHAHA!!!!111 i'm so evil /*для тех кто не догоняет, посчитайте количество фигурных скобок*/


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: kuzulis от Февраль 16, 2009, 13:55
Во! Так гораздо лучше читается и понятнее и сразу все видно!


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: Tonal от Февраль 16, 2009, 14:12
С моей точке зрения, всё зависит от пишущего/читающего.
Если кто-то воспринимает if-else как неделимую конструкцию, то понятно, что он будет писать
Код
C++ (Qt)
if (expr) {
 ret = true_ret;
} else {
 ret = false_ret;
}
return ret;
 
И ему всегда приходится анализировать всю конструкцию.
С другой стороны, в этом случае конструкция if-else упрощается - остаётся 1 вариант из 2х

Но вот то, что при этом код упрощается - не факт.
У того же Маркконнелла в главе про множественные return-ы напрямую советуется синтаксис
Код
C++ (Qt)
if (expr)
 return true_ret;
return false_ret;
 
Т.е. выйти из функции как можно быстрее.
Тут мы ещё и бонус получаем - использованные в функции ресурсы освобождаются наиболее быстро, или вообще не захватываются (RAII).

Возвратить напрямую результат вычисления предиката тоже вполне здравая мысль: зачем городить какие-то промежуточные переменные и конструкции, если всё, что нужно это значение выражения?
То же и с тернарным оператором. :)

Короче в итоге, ежели предполагаешь, что читатели будут с плохим знанием синтаксиса конкретного языка - то нужно употреблять конструкции к которым оные читатели привыкли.
Ну а ежели таки предполагается, что читатели будут нормально знакомы с языком, то вполне допустимо использовать его возможности - это ускоряет восприятие кода. :)


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 16, 2009, 15:18
Короче в итоге, ежели предполагаешь, что читатели будут с плохим знанием синтаксиса конкретного языка - то нужно употреблять конструкции к которым оные читатели привыкли.
Ну а ежели таки предполагается, что читатели будут нормально знакомы с языком, то вполне допустимо использовать его возможности - это ускоряет восприятие кода. :)

+1


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: xintrea от Февраль 16, 2009, 23:10
Код
C++ (Qt)
QCursor result;
if (testAttribute(Qt::WA_SetCursor)) {
   if (d->extra && d->extra->curs) {
       result = *d->extra->curs;
   } else {
       resut = QCursor(Qt::ArrowCursor);
   }
} else if (isWindow() || !parentWidget()) {
   result = QCursor(Qt::ArrowCursor);
} else {
   result = parentWidget()->cursor();
}
return result;
что-то забыл... ах да, MUAHAHAHAHA!!!!111 i'm so evil /*для тех кто не догоняет, посчитайте количество фигурных скобок*/

Плюс 1! Так гораздо лучше, чем то, что в исходниках Qt.

Хотя, можно былоб отформатировать так

Код
C++ (Qt)
QCursor result;
 
if (testAttribute(Qt::WA_SetCursor)) {
 
if (d->extra && d->extra->curs)
 result = *d->extra->curs;
else
 resut = QCursor(Qt::ArrowCursor);
 
}
else {
 
if (isWindow() || !parentWidget())
 result = QCursor(Qt::ArrowCursor);
else
 result = parentWidget()->cursor();
 
}
 
return result;



Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: Rcus от Февраль 17, 2009, 06:12
Плюс 1! Так гораздо лучше, чем то, что в исходниках Qt.
Ну что вы, я так старался изуродовать код, что решил лучшим способ будет написать его в дельфинном стиле :) А вот если применить два рефакторинга: защитные проверки (guardian clause) и удаление временной переменной то получим в точности оригинальный код :)))


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 17, 2009, 07:29
гг...Rcus спалил xintrea :)
а я уже и забыл каким стилем оформлял код, когда работал с багландом...


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: ритт от Февраль 17, 2009, 07:47
ой, что сейчас нашёл!..
вкратце примерно вот так:
Код:
int linew(int w)
{
  switch(w) {
  case 0:
  case 1: return 0;
  case 2: return 1;
  default: return 3;
  }
}
и ведь по смыслу всё правильно - не придерёшься! :)


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: kuzulis от Февраль 17, 2009, 08:29
Цитировать
и ведь по смыслу всё правильно - не придерёшься!
и? в чем подвох?


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 17, 2009, 12:22
Ну что вы, я так старался изуродовать код, что решил лучшим способ будет написать его в дельфинном стиле :)

Тогда можно сделать "лучше" ;)

Код
C++ (Qt)
#define begin {
#define end }
 
if (<condition>)
begin
   ....
end
   else
   begin
       ...
   end


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: Rcus от Февраль 17, 2009, 12:40
не хватает #define then для полного счастья /*sigh*/


Название: Re: [флэйм] if(expr) return 1; else return 0;
Отправлено: pastor от Февраль 17, 2009, 12:45
не хватает #define then для полного счастья /*sigh*/

Ах да! забыл :)