66

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

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

個人的にどのスタイルを使用していますか、または最も読みやすいと思いますか?

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

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

4

15 に答える 15

102

三項演算子は一般的に避けるべきですが、この形式は非常に読みやすくなります。

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

このように、状態と結果は同じ行にまとめられ、何が起こっているのかをざっと見て理解するのはかなり簡単です。

于 2008-10-28T13:39:46.533 に答える
81

三項演算子を使用してネストされた条件を記述しないようにしています。これは可読性に反するものであり、条件式の使用に勝る付加価値はありません。

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

$value = ($a < 0) ? 'minus' : 'plus';
于 2008-10-28T13:17:17.500 に答える
26

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

if else if else
于 2008-10-28T13:14:08.600 に答える
21

言及されていないので私が持ち出している、私が時々使用するスタイルは次のようなものです。

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

..しかし、通常は、すべてを 1 行に入れると長くなりすぎる場合に限ります。= ? :オールラインで揃えるとすっきり見えると思います。

于 2008-11-12T07:37:05.867 に答える
15

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!
于 2009-09-25T02:17:24.647 に答える
12

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

于 2008-10-28T13:15:05.383 に答える
5

私は条件を括弧で囲む傾向があります: (a == b) ? 1:0

于 2008-10-28T13:23:05.990 に答える
2

三項条件は、コードをよりクリーンでエレガントにすることができ、最も重要なことは、正しいことを強調し、繰り返しを避けるのに役立ちます。それらの使用を検討してください。ただし、そうすることでコードを読みにくくしないでください。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

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

于 2011-02-04T20:21:49.650 に答える
2

私は一般的な意見に反対します。私は、条件付き演算子のスタイルに関しては、Imran のようなものです。1行にきれいに収まる場合は、1行に保ちます。1 行にきれいに収まらない場合は改行しますが、インデントには 1 つのタブ (4 つのスペース。タブにスペースを挿入するように VS を設定しています) のみを使用します。多くの場合、条件演算子の方が文脈的に意味があるため、すぐにif-にジャンプしません。else(ただし、文脈上意味がない場合は、単に使用しません。)

また、条件演算子をネストしません。その時点で、私はそれを読むのが難しすぎると思うので、もっと冗長なスタイルに行く時が来ましifelse.

于 2008-10-28T13:17:09.780 に答える
1

「不自然な例」は、(または上の行にあるものに基づいてではなく、左マージンからインデントすることを除いて、インデントする方法です。

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

于 2008-11-12T07:50:55.963 に答える
0
$foo = (isset($bar)) ? $bar : 'default';
于 2008-10-29T14:04:52.927 に答える
0

イムラン、あなたはこれを美しくフォーマットしました。ただし、3 項演算子は、2 つ以上入れ子にすると判読不能になる傾向があります。if-else ブロックを使用すると、追加レベルのわかりやすい入れ子が得られる場合があります。それを超えて、関数またはテーブル駆動型プログラミングを使用します。

于 2008-10-28T13:24:45.783 に答える
0

私はそれを使用しません。小さなソース==より効率的なコンパイル済みコードを期待して、スペースを節約しようとしてソースコードを入力するような匂いがしました。

まったく読みにくいとは思いますが、その多くは、まったく使用していないためです。

于 2008-10-28T13:13:32.843 に答える
0

if .. else の方がはるかに読みやすいことがわかったので、私は三項演算子をまったく使用しない傾向があります。

于 2008-10-28T13:13:48.567 に答える
0

私は個人的には、変数(Javaで)の割り当てにのみ使用します。たとえば、次のようになります。

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

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

String val; [...]
int var = (val == null) ? 0 : Integer.parseInt(val);
于 2008-10-29T14:22:29.083 に答える