Какой стиль кодирования вы используете для троичного оператора?
Я держу это в одной строке, если это коротко. В последнее время я использую этот стиль для длинных или вложенных выражений троичных операторов. Придуманный пример:
$value = ( $a == $b )
? 'true value # 1'
: ( $a == $c )
? 'true value # 2'
: 'false value';
Лично какой стиль вы используете или считаете наиболее читабельным?
Редактировать: (когда использовать троичный оператор)
Я обычно избегаю использования более 2-х уровней глубокого троичного оператора. Я предпочитаю 2-х уровневый оператор с двумя уровнями, а не 2 уровня, если я повторяю переменные в шаблонных скриптах PHP.
15 ответов
Троичного оператора, как правило, следует избегать, но эта форма может быть вполне читабельной:
result = (foo == bar) ? result1 :
(foo == baz) ? result2 :
(foo == qux) ? result3 :
(foo == quux) ? result4 :
fail_result;
Таким образом, условие и результат сохраняются в одной строке, и довольно легко проследить и понять, что происходит.
Я стараюсь не использовать троичный оператор для записи вложенных условий. Он не поддается чтению и не предоставляет никаких дополнительных значений по сравнению с использованием условных выражений.
Я использую его только в том случае, если он умещается в одну строку, и кристально ясно, что это значит.
$value = ($a < 0) ? 'minus' : 'plus';
Стиль, который я иногда использую, который я поднимаю, так как он не был упомянут, похож на это:
$result = ($x == y)
? "foo"
: "bar";
..но обычно только если поместить все это в одну строку делает это слишком длинным. Я считаю, что имея = ? :
вся линия делает это выглядит аккуратнее.
Лично я использую троичный оператор, только если он помещается на одной строке. Если нужно пролить, то пора старому доброму
if else if else
Вложенные троичные операторы PHP ведут себя по-разному.
Этот синтаксис проходит все следующие тесты. Основано на http://deadlytechnology.com/web-development-tips/php-ternary-syntax/
$myvar = ($x == $y)
?(($x == $z)?'both':'foo')
:(($x == $z)?'bar':'none');
,
Смотрите: http://au.php.net/ternary
Пример № 3 "Неочевидное троичное поведение" объясняет, почему следующее не работает в PHP.
$x = 1;
$y = 2;
$z = 3;
$myvar = ($x == $y)
? "foo"
: ($x == $z)
? "bar"
: "none";
$myvar == 'none'; // Good
$x = 1;
$y = 2;
$z = 1;
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";
$myvar == 'bar'; // Good
$x = 1;
$y = 1;
$z = 3;
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";
$myvar == 'bar'; // Bad!
$x = 1;
$y = 1;
$z = 1;
$myvar = ($x == $y) ? "foo" : ($x == $z) ? "bar" : "none";
$myvar == 'bar'; // Bad!
Троичные операторы - это короткие эффективные способы написания простых операторов if. Они не должны быть вложенными или трудными для чтения. Помните: вы пишете программное обеспечение один раз, но оно читается 100 раз. Это должно быть легче читать, чем писать.
Условное троичное выражение может сделать код чище и элегантнее, а главное, помочь вам сделать акцент на правильных вещах и избежать повторения. Подумайте об их использовании, но при этом не делайте код менее читабельным. В VB.NET:
'before refactoring
If x = 0 Then ' If-Then-Else puts emphasis on flow control
label = "None"
Else
label = Foo.getLabel(x) ' If-Then-Else forces repeat of assignment line
End If
'after refactoring
label = If(x = 0, "None", Foo.getLabel(x)) ' ternary If puts emphasis on assignment
Обратите внимание, что "он менее читабелен" - это не то же самое, что "я не привык это видеть".
Я не согласен с общим мнением. Я вроде Имрана с моим условным операторским стилем. Если он точно помещается на одной строке, я сохраняю его на одной строке. Если он не помещается в одну строку, я ломаю его, но я использую только одну вкладку (4 пробела; у меня установлен VS для вставки пробелов для табуляции) для отступа. Я не сразу прыгаю на if
-else
, потому что большую часть времени условный оператор имеет больше смысла в контексте. (Однако, если это не имеет смысла в контексте, я просто не использую его.)
Также я не вкладываю условные операторы. На этом этапе мне действительно трудно читать, и пришло время перейти к более подробному if
-else
стиль.
"Придуманный пример" - это то, как я должен сделать отступ, за исключением того, что я сделаю отступ с левого поля, не основываясь на том, где (или что-то еще находится на линии выше).
Для троичных хулителей - удобочитаемость - это главное. Если вы не думаете, что это делает код более читабельным, не используйте его. Но я считаю, что это имеет место, по крайней мере, в некоторых случаях.
Я лично использую его только для присвоения переменной (в Java), например:
String var = (obj == null) ? "not set" : obj.toString();
и (другой пример) при использовании функции, которая не допускает нулевого параметра, такого как:
String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
Имран, ты это красиво отформатировал. Однако троичный оператор имеет тенденцию становиться нечитаемым, если вы вкладываете больше двух. блок if-else может дать вам дополнительный уровень понятного вложения. Кроме того, используйте функцию или программирование на основе таблиц.
Я не использую это. Мне всегда казалось, что я пытаюсь сэкономить место и вводить исходный код, ожидая, что небольшой исходный код == более эффективный скомпилированный код.
Я вообще не нахожу его читабельным, но во многом это потому, что я просто никогда им не пользуюсь.
Я вообще не использую троичный оператор, как я нахожу, если.. еще гораздо более читабельным.