Я держу его в одной строке, если он короткий. В последнее время я использую этот стиль для более длинных или вложенных тернарных выражений оператора. Надуманный пример:
$value = ( $a == $b ) ? 'true value # 1' : ( $a == $c ) ? 'true value # 2' : 'false value';
Лично, какой стиль вы используете или найдете наиболее читаемым?
Изменить: (когда использовать тернарный оператор)
Обычно я избегаю использовать более двух уровней глубокого троичного оператора. Я предпочитаю двухуровневый тернарный оператор более двух уровней if-else, когда я повторяю переменные в скриптах PHP-скриптов.
Тройной оператор, как правило, следует избегать, но эта форма может быть вполне читаемой:
result = (foo == bar) ? result1 : (foo == baz) ? result2 : (foo == qux) ? result3 : (foo == quux) ? result4 : fail_result;
Таким образом, состояние и результат сохраняются вместе в одной строке, и довольно легко сэкономить и понять, что происходит.
Я стараюсь не использовать тернарный оператор для записи вложенных условий. Это бросает вызов читабельности и не дает дополнительной стоимости за счет условного.
Только если он может поместиться на одной линии, и кристально ясно, что это значит, я использую его:
$value = ($a < 0) ? 'minus' : 'plus';
Лично я использую только тернарный оператор, если он вписывается в одну строку. Если это необходимо, то пришло время для старого
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!
стиль, который я иногда использую, который я воспитываю, поскольку он не упоминался, выглядит следующим образом:
$result = ($x == y) ? "foo" : "bar";
.. но обычно, только если положить все это на одну линию, это слишком долго. Я считаю, что с = ? :
= ? :
все выстраиваются, что делает его более аккуратным.
тройные операторы – это короткие эффективные способы написания простых операторов if. Они не должны быть вложенными или трудными для чтения. Помните: вы пишете программное обеспечение один раз, но читается 100 раз. Это должно быть легче читать, чем писать.
Я склонен заключить условие в круглые скобки: (a == b)? 1: 0
Я не соглашусь с общим мнением. Я вроде как Имран со своим условным стилем оператора. Если он подходит по одной линии, я держу его на одной линии. Если это не соответствует чисто одной строке, я разбиваю ее, но я использую только одну вкладку (4 пробела, у меня есть VS, чтобы вставлять пробелы для вкладок) для отступа. Я не сразу перехожу к if
else
, потому что много раз условный оператор имеет больше смысла контекстуально. (Однако, если это не имеет смысла контекстуально, я просто не использую его.)
Кроме того, я не устанавливаю условные операторы. В этот момент мне трудно читать, и пришло время перейти к более подробному стилю if
else
.
«Надуманный пример» – это то, как я мог бы отступать от него, за исключением того, что я отступал от левого поля, а не от того, где (или что-то еще на линии выше).
Тройным хулителям – читаемость. Если вы не думаете, что это делает более читаемый код, не используйте его. Но я считаю, что это было наоборот, по крайней мере, некоторое время.
Тройной условный код может сделать код более чистым и более элегантным, и, самое главное, поможет вам сделать упор на правильные вещи и избежать повторения. Подумайте об их использовании, но не делайте код менее удобочитаемым. В 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
Обратите внимание: «это менее читаемо» – это не то же самое, что «я не привык видеть это».
Я не использую его. Мне всегда нравилось, как пытаться сэкономить место и ввести исходный код с ожиданием того, что маленький исходный код более эффективный скомпилированный.
Я не считаю его читаемым вообще, но многое из того, что я его никогда не использую.
Я обычно не использую тернарный оператор вообще, поскольку я нахожу, если .. еще более читаем.
Имран, ты отформатировал это красиво. Тем не менее, тернарный оператор, как правило, становится нечитаемым, так как вы гнездились более двух. блок if-else может дать вам дополнительный уровень понятной вложенности. Помимо этого, используйте программирование с функцией или таблицей.
$foo = (isset($bar)) ? $bar : 'default';
Я лично использую его только для назначения переменной (в java), например:
String var = (obj == null) ? "not set" : obj.toString();
и (другой пример) при использовании функции, которая не допускает нулевой параметр, такой как:
String val; [...] int var = (val == null) ? 0 : Integer.parseInt(val);