web-dev-qa-db-ja.com

三項演算子に使用するコーディングスタイルはどれですか?

短い場合は1行にまとめます。最近、私はこのスタイルをより長いまたはネストされた三項演算子式に使用しています。不自然な例:

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

個人的にどのスタイルを使用しますか、それとも最も読みやすいですか?

編集:(三項演算子をいつ使用するか)

私は通常、2レベルを超える深さの三項演算子の使用を避けます。 PHPテンプレートスクリプトで変数をエコーする場合、2レベルのif-elseよりも2レベルの深い3項演算子を好む傾向があります。

52
Imran

三項演算子は一般に避けられるべきですが、この形式は非常に読みやすいかもしれません:

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

このようにして、条件と結果が同じ行にまとめられ、何が起こっているのかを簡単に確認して理解するのはかなり簡単です。

86
Simon Howard

ネストされた条件を記述するために三項演算子を使用しないようにしています。読みやすさに反し、条件付きの使用に追加の価値を提供しません。

それが1行に収まる場合、そしてそれが何を意味するかが非常に明確である場合にのみ、私はそれを使用します。

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

個人的には、3行演算子が1行に収まる場合にのみ使用します。スパンする必要がある場合は、古き良き時代です

if else if else
24
biozinc

私が言及していないので私が持ち出しているスタイルときどきを使用すると、次のようになります。

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

..しかし、通常は、すべてを1行に置くと長くなりすぎる場合に限ります。 = ? :すべてのラインナップにより、見栄えが良くなります。

14
nickf

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「非自明な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!
13
Chris Jacob

三項演算子は、単純なifステートメントを書くための効果的な短い方法です。入れ子にしたり、読みにくくすることはできません。覚えておいてください:あなたは一度ソフトウェアを書きますが、100回読み込まれます。書くより読む方が簡単です。

9
Rick Kierner

私は常識に反対します。私は、条件付き演算子のスタイルがイムランに似ています。 1行に収まる場合は、1行に収めます。 1行に収まらない場合は改行しますが、インデントには1つのタブ(4つのスペース、VSでタブのスペースを挿入するように設定)のみを使用します。 if-elseにすぐにジャンプすることはありません。条件演算子は、状況に応じて意味をなすことが多いからです。 (ただし、文脈上意味がない場合は、使用しません。)

また、条件演算子はネストしません。その時点で、私は読むのが難しすぎることに気づきました。今度は、より冗長なif-elseスタイルに進みます。

2
John Rudy

3項条件式を使用すると、コードがよりクリーンでエレガントになります。最も重要なのは、適切なものに重点を置き、繰り返しを避けることです。それらを使用することを検討してください。ただし、そうすることでコードが読みにくくなることはありません。 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

「読みにくい」は「見たことがない」と同じではないことに注意してください。

1

「考案された例」は、左端からインデントすることを除いて、インデントする方法です。

三元批判者にとって-読みやすさがポイントです。コードが読みやすくなると思わない場合は、使用しないでください。しかし、私は逆のことが少なくとも時々あると思います。

1
ysth

使わない。小さなソース==より効率的なコンパイル済みコードであると期待して、スペースを節約し、ソースコードを入力しようとするような感じがしました。

私はそれをまったく読めないと思いますが、それの多くは私がそれを使用したことがないからです。

0
Tim

私は、3項演算子をまったく使用しない傾向があります。

0
SmacL

イムラン、あなたはこれを美しくフォーマットしました。ただし、3つ以上の演算子をネストすると、3項演算子は読みにくくなる傾向があります。 if-elseブロックを使用すると、理解しやすい入れ子のレベルを上げることができます。さらに、関数またはテーブル駆動プログラミングを使用します。

0
Yuval F
$foo = (isset($bar)) ? $bar : 'default';
0
stefan2904

私は個人的には変数の割り当て(Javaの場合)にのみ使用します:

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

(その他の例)次のようなnullパラメータを許可しない関数を使用する場合:

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