Здравствуйте, Begemot_, Вы писали:
B_>Почему так не пишут или я ошибаюсь и это нормально и принято?
Предпочитаю использовать тернарный оператор, если речь идет только о возвращении значения и условный оператор, если имеются побочные эффекты.
За тернарный оператор:
— позволяет запихнуть всё в одно выражение
— позволяет избежать присваиваний, заменяя их конструированием
— позволяет использовать временные объекты, это полезно для RVO (которое любят компиляторы; тогда как NRVO им даётся с бОльшим трудом)
const Foo x (a() ? b() : c()); // даже copy constructible может не потребоваться
foo(d() ? e() : f());
// versus
/*nonconst*/Foo x; // default constructible, assignableif(a()) x = b(); else x = c();
if(d()) foo(e()); else foo(f());
За if на разных строчках:
— позволяет ставить брекпоинты на ветках
— не требует однотипности веток
За if на одной строчке:
— кр-сть — с-а т.!
Короче говоря, однострочный if — это худший вариант.
Здравствуйте, Begemot_, Вы писали:
B_>Почему так не пишут или я ошибаюсь и это нормально и принято?
Я в своём коде использую только для возвращаемоего параметра. 1 условия с else имеют свойство разрастаться, к томуже 2 не поставить бряку на ветку, просто тупо чтобы не путать 3 (тернальный на возвращаемое только), 4 чтобы иметь одинакое строение условий везде (не везде есть else, как то тупо в одном месте писать x ? foo1() : foo2(); а во втором if ( x ) foo(); )
Вот такие причины лично у меня.
Резюме:
1. Если тебя это не смущает, то пользуйся на здоровье
2. Если у тебя тревожно на душе из-за такого написания, то не пиши так и спи спокойно
Здравствуйте, CreatorCray, Вы писали:
Pzz>>(a ? add : remove)( (y ? a : b)[ z ? c : d ] ); CC>Да здравствует обфускация!
ИМХО код вполне читается, а так же самодокументирован: не лезь а то убъёт!
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А так еще лучше
PD>(x ? add : remove) (t ? a : b);
PD>после чего читающий этот код долго чешет в затылке, пытаясь понять, что же сделали и с чем.
Какие сложности? В зависимости от x выбирается функтор, а зависимости от t — его аргумент. Своеобразный такой сurrying на C
Чесать в затылке лично мне приходится думая "как это переписать на if", "как поддерживать такой if"...
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, gear nuke, Вы писали:
Pzz>>>(a ? add : remove)( (y ? a : b)[ z ? c : d ] ); CC>>Да здравствует обфускация!
GN>ИМХО код вполне читается, а так же самодокументирован: не лезь а то убъёт!
А это мысль! А то у меня часто возникает обратная проблема: лезут, а убивать приходится мне, а у меня для этого характер слишком мягкий
Здравствуйте, gear nuke, Вы писали:
PD>>(x ? add : remove) (t ? a : b);
PD>>после чего читающий этот код долго чешет в затылке, пытаясь понять, что же сделали и с чем.
GN>Какие сложности? В зависимости от x выбирается функтор, а зависимости от t — его аргумент. Своеобразный такой сurrying на C
Между прочим, если бы у "функтора" был не один аргумент, а пяток, то так по-моему сильно понятнее выглядит, отдельно выбирать функцию в зависимости от обстановки, а потом одним махом вызывать уже выбраную. Иначе приходится дублировать вычисление аргументов, со всеми вытекающими прелестями копипасты.
Если бы вариантов было не два, а больше, имело бы смысл завести указатель на функцию, вычислить его, а потом позвать.
Здравствуйте, Begemot_, Вы писали:
B_>Почему так не пишут или я ошибаюсь и это нормально и принято?
ИМХО тренарный оператор используем там, где он позволяет избежать дублирования кода и повысить читаемость, например:
longName = very_very_very_long_function_name (argumentOne, argumentTwo, flag ? number : 45);
т.е. четко видно, чем отличаются ветки (в отличие от if/else).
В случае с return он позволяет избежать дублирования слова return Ну и сэкономить 3 строчки при строгом стиле кодирования (4 строки на if/else) и одну при "самом строгом" (3 строки на тренарный оператор)