Какой стиль кодирования вы используете для тернарного оператора?[закрыто]
-
04-07-2019 - |
Вопрос
Я держу это в одной строке, если оно короткое.В последнее время я использую этот стиль для более длинных или вложенных выражений тройных операторов.Надуманный пример:
$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
стиль, который я иногда использую, который я привожу, поскольку он не был упомянут, выглядит следующим образом:
$result = ($x == y)
? "foo"
: "bar";
.. но обычно, только если поместить все это в одну строку, это слишком долго. Я считаю, что имея =?
вся цепочка выглядит более аккуратно.
Вложенные тернарные операторы 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 раз. Это должно быть легче читать, чем писать.
Я обычно заключаю условие в скобки: (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);