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

StackOverflow https://stackoverflow.com/questions/243217

Вопрос

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

$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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top