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

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

$value = ( $a == $b ) 
            ? 'true value # 1'
            : ( $a == $c )
                ? 'true value # 2'
                : 'false value';

Лично, какой стиль вы используете или найдете наиболее читаемым?

Изменить: (о том, когда использовать тернарный оператор)

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

Ответ 1

Тройной оператор, как правило, следует избегать, но эта форма может быть вполне читаемой:

  result = (foo == bar)  ? result1 :
           (foo == baz)  ? result2 :
           (foo == qux)  ? result3 :
           (foo == quux) ? result4 : 
                           fail_result;

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

Ответ 2

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

Только если он может поместиться в одну строку, и это кристально ясно, что это значит, я использую его:

$value = ($a < 0) ? 'minus' : 'plus';

Ответ 3

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

if else if else

Ответ 4

Вложенные тройные операторы 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!

Ответ 5

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

$result = ($x == y)
        ? "foo"
        : "bar";

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

Ответ 6

тернарные операторы являются короткими эффективными способами написания простых операторов if. Они не должны быть вложенными или трудными для чтения. Помните: вы пишете программное обеспечение один раз, но читается 100 раз. Это должно быть легче читать, чем писать.

Ответ 7

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

Ответ 8

Я согласен с общим мнением. Я вроде как Имран со своим условным стилем оператора. Если он подходит по одной линии, я держу его на одной линии. Если это не соответствует чисто одной строке, я разбиваю ее, но я использую только одну вкладку (4 пробела, у меня есть VS, чтобы вставлять пробелы для вкладок) для отступа. Я не сразу перехожу к if - else, потому что много раз условный оператор имеет больше смысла контекстуально. (Если это не имеет смысла контекстуально, я просто не использую его.)

Кроме того, я не устанавливаю условные операторы. В этот момент мне трудно читать, и пришло время перейти к более подробному стилю if - else.

Ответ 9

"Надуманный пример" - это то, как я мог бы отступать от него, за исключением того, что я бы отступал от левого поля, а не от того, где (или что-то еще на линии выше.

Для тернарных хулителей читаемость - это точка. Если вы не думаете, что это делает более читаемый код, не используйте его. Но я считаю, что это было наоборот, по крайней мере, некоторое время.

Ответ 10

Тернарный условный код может сделать код более чистым и более элегантным, и, самое главное, поможет вам сделать акцент на правильных вещах и избежать повторения. Подумайте об их использовании, но не делайте код менее удобочитаемым. В 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

Обратите внимание: "это менее читаемо" - это не то же самое, что "я не привык видеть это".

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

Ответ 14

$foo = (isset($bar)) ? $bar : 'default';

Ответ 15

Я лично использую его только для назначения переменной (в java), например:

String var = (obj == null) ? "not set" : obj.toString();

и (другой пример) при использовании функции, которая не допускает нулевой параметр, например:

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);