LINUX.ORG.RU

Тернарный оператор. Кто его использует?


0

0
Один жабер утверждал, что тернарный оператор - злое зло. Что он в яве есть, но его не используют.

Я его использую довольно часто в с++. И, имхо, не особо он код усложняет. Но вот недавно увидел баг в одном проекте:

bool addSomeValue;

int percentage = 100 + addSomeValue ? 10 : 0;

И задумался над сабжет. Может тернарный оператор не нужен?

anonymous
Использую очень часто. А про приоритеты - просто помнить надо. Не важно, с тринарным оператором или с логическим ИЛИ.
KRoN73 ★★★★★
()
Использую часто, в жабоскрипте в основном.

В Хаскеле иногда использую такое:

(?) :: Bool -> a -> a -> a

b ? x = \y -> if b then x else y

И можно юзать: b ? x $ y

Miguel ★★★★★
()
В качестве правила для себя установил упаковывать сложные (напр: a!=b) операнды этого оператора в скобки. Зачастую это избыточно, но позволяет избежать лишнего гимора.
wfrr ★★☆
()
>Может тернарный оператор не нужен?

Не нужен - не используй. Какие проблемы?

JackYF ★★★★
()
> int percentage = 100 + addSomeValue ? 10 : 0;

Здесь нарушено правило "Не уверен в приоритетах -- ставь скобки".

> Может тернарный оператор не нужен?

Нужен, лично я очень страдал, что в питоне его не было (в итоге появился).

sv75 ★★★★★
()
я использую. очень сильно уменьшает кол-во символов, так что это жабопротивный оператор =)
generatorglukoff ★★
()
Как раз в яве эту ошибку выловить легко, так как там bool не кастится к инту и инт к boolу
winger
()
Ответ на: комментарий от KRoN73
> А в Форте тренарным оператором является дефолтовый if ... else ... then :)

В Форте нет операторов, как и вообще экспрешенов. Там всё - стейтменты.

Miguel ★★★★★
()
Ответ на: комментарий от KRoN73
> А в Форте тренарным оператором является дефолтовый if ... else ... then :)

Кстати, как раз в Хаскеле дефолтный if-then-else можно назвать оператором, ибо он как раз возвращает значение:

a = func (if b then c else d)

Miguel ★★★★★
()
Я, конечно, не образец программиста на джаве, но использовал его часто.

А приоритет у него самый низкий, запоминать там особо нечего.

Legioner ★★★★★
()
часто использую. удобная штука.
isden ★★★★★
()
Ответ на: комментарий от Miguel
>В Форте нет операторов, как и вообще экспрешенов. Там всё - стейтменты.

В Форте всё - слова :)
KRoN73 ★★★★★
()
>Один жабер утверждал, что тернарный оператор - злое зло.

Потому что он идиот. По сравнению с проблемами которые могут возникнуть например с мультитредингом в кучерявом коде это ноль, зеро.

Absurd ★★★
()
Я использую. Именно в жабакоде. Жаба и так члишком многословна, чтобы отказываться от такого сокращения.

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

Zenom ★★★
()
Самый большой "грех" тернарного оператора - в том, что с ним иной читатель может читать код быстрее, чем думает, и потому не успевает понимать код по мере прочтения. Второй "грех" - то, что на нём классические шедевры типа if(a) return true; else return false; выглядят не как откровение, а как комичное return a ? true : false. Третий грех - то, что, в отличие от каскада if, в каскаде ?: нет чётких обязательных приёмов форматирования, и незадачливый программист может легко написать такое, в чём сам быстро (см. первый грех) запутается.
alexsaa ★
()
Синтаксический сахар вызывает рак сами знаете чего. Без субжа можно очень хорошо обходится, и все от этого только выигрывают. Если ты (или тем более кто-то другой) не планируешь потом читать то, что написал, то используй сколько хочешь. Но вроде как считается, что программа пишется один раз, а читается много раз, и разными людьми. if then else намного яснее.
undet ★
()
Ответ на: комментарий от undet
> Без субжа можно очень хорошо обходится, и все от этого только выигрывают.

Почему? Без do { } while тоже можно обходится, да что там, все циклы можно заменить на for (;;) { .. if (cond) break; }. Будем заменять?

> if then else намного яснее.

4.2, мне тернарный оператор намного яснее.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner
>for (;;) { .. if (cond) break; }. Будем заменять?

А все for(;;) можно заменить на if cond then ... :)

Бейсик рулит :D
KRoN73 ★★★★★
()
Ответ на: комментарий от Legioner
> Почему? Без do { } while тоже можно обходится, да что там, все циклы можно заменить на for (;;) { .. if (cond) break; }. Будем заменять?

do {} while не прячет того, что разработчик хочет выразить, как это делает тернарный оператор. Если for (;;) { if (cond) break; } точнее выражает то, что ты хочешь сказать, то, конечно, стоит заменять. Такое:

if n > 5 then return "AAA"; else return "BBB"; end if;

точнее выражает то, что происходит, чем:

return n > 5 ? "AAA" : "BBB";

Всё вышеизложеное - это, конечно, IMO.

undet ★
()
Ответ на: комментарий от undet
> if then else намного яснее.

От ведь идиот... Читать простыню из вложенных if ... then ... else просто невозможно. Компактная запись - не обязательно нечитаемая запись, так же как и запись развернутая может быть существенно более запутанной, чем компактная.

А вообще, языки, где есть разделение между выражениями и операторами, надо давить беспощадно.

anonymous
()
Ответ на: комментарий от anonymous
Кроме "идиот" какие-нибудь ещё доводы будут? Про простыню поподробнее, и почему давить. А то пока звучит как "Це++ отстой для быдла, но я, пока, не знаю почему".
undet ★
()
Ответ на: комментарий от undet
>точнее выражает то, что происходит, чем

Иногда код бывает, типа:

object->get_sub_object()->set_param($object->flag() ? "yes" : "no", true);

Предлагаешь вместо него писать:

if($object->flag())
    object->get_sub_object()->set_param("yes", true);
else
    object->get_sub_object()->set_param("no",  true);

?

Собственно, у меня сабжи чаще всего именно в таком виде и используются.

return ... ? ... : ...; - это уже намного реже. Редко бывает такой
простой возврат :)
KRoN73 ★★★★★
()
Ответ на: комментарий от undet
>if n > 5 then return "AAA"; else return "BBB"; end if;

>точнее выражает то, что происходит, чем:

>return n > 5 ? "AAA" : "BBB";

одно и то же они выражают. Спор ни о чём

/c: stoped

anonymous
()
Ответ на: комментарий от KRoN73
Возможно, в этом случае оправдано. Но

object->get_sub_object()->set_param($object->flag() ? "yes" : "no", true);

звучит как-то длинно. Да, я бы написал:

SomeObj* sub = object->get_sub_object();

if (object->flag()) {
  sub->set_param ("yes", true);
} else {
  sub->set_param ("no", true);
}

Да, так длиннее, но так, по моему (может быть не совсем вменяемому :) мнению, сразу ... видна общая картина, чтоли. Не нужно парсить где и что там происходит в строке. Существуют же языки без subj и ничего, всё нормально. Вообще, конечно, это стиль. О нём бесполезно спорить.
undet ★
()
ещё я его использую так:

int compare(int a, int b) {
return a <= b ? a < b ? -1 : 0 : 1;
}

Я считаю, что проще один раз выучить и запомнить эту идиому, а потом просто проверять соответствие ей, чем каждый раз ковыряться во вложенных if'ах.

Что до object->setValue(flag ? yesValue : noValue), то, имхо, тут дело вкуса. Ясно, что глупо говорить, что if не нужен, т.к. есть тернарный оператор. Точно так же нет смысла отказываться от тернарного оператора только потому что есть if.
alexsaa ★
()
Ответ на: комментарий от undet
> Да, так длиннее, но так, по моему (может быть не совсем вменяемому :) мнению, сразу ... видна общая картина, чтоли. Не нужно парсить где и что там происходит в строке.

Да, нужно парсить, что там и где происходит в нескольких строках. Недостатком записи с if является дублирование кода - перепиши-ка так что-нибудь типа

WinAPIBraindamagedProcedure(handle, arg1, arg2, options.foobar ? arg3 : altarg3, 0, 14);

и потом ощути боль от исправления этого кода и поиска ошибок, вызванных тем что кто-то несимметрично исправил вызовы в разных ветках if-else.

Ну и if-else слишком массивный, он отодвигает на второй план собственно действие, и ставит на первый условие, часто второстепенное, что плохо.

Т.е. вместо

АТутМыРаскрасимВсеОкнаВ(страна=="США"?ТР_ЗВЕЗДЫ_ПОЛОСЫ:ТР_ДВУГЛАВЫЕ_ОРЛЫ);

где важной инфой является то, что вид всех окон изменится, а как - вторично, у тебя получается

если (страна = "США")

АТутМыРаскрасимВсеОкнаВ(ТР_ЗВЕЗДЫ_ПОЛОСЫ);

иначе

АТутМыРаскрасимВсеОкнаВ(ТР_ДВУГЛАВЫЕ_ОРЛЫ);

чтение которого начинается с "проверим, не в США ли мы", что для общего понимания третьестепенно.

> Существуют же языки без subj и ничего, всё нормально.

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

anonymous
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.