Какой стиль кодирования вы используете для троичного оператора?

Я держу это в одной строке, если это коротко. В последнее время я использую этот стиль для длинных или вложенных выражений троичных операторов. Придуманный пример:

$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 раз. Это должно быть легче читать, чем писать.

Я склонен заключать условие в скобки: (a == b)? 1: 0

Условное троичное выражение может сделать код чище и элегантнее, а главное, помочь вам сделать акцент на правильных вещах и избежать повторения. Подумайте об их использовании, но при этом не делайте код менее читабельным. В 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);
$foo = (isset($bar)) ? $bar : 'default';

Имран, ты это красиво отформатировал. Однако троичный оператор имеет тенденцию становиться нечитаемым, если вы вкладываете больше двух. блок if-else может дать вам дополнительный уровень понятного вложения. Кроме того, используйте функцию или программирование на основе таблиц.

Я не использую это. Мне всегда казалось, что я пытаюсь сэкономить место и вводить исходный код, ожидая, что небольшой исходный код == более эффективный скомпилированный код.

Я вообще не нахожу его читабельным, но во многом это потому, что я просто никогда им не пользуюсь.

Я вообще не использую троичный оператор, как я нахожу, если.. еще гораздо более читабельным.

Другие вопросы по тегам