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
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.