代码之家  ›  专栏  ›  技术社区  ›  Imran

三元运算符使用哪种编码样式?[关闭]

  •  50
  • Imran  · 技术社区  · 16 年前

    如果短的话,我就把它排成一行。最近,我一直在使用这种样式来表示更长的或嵌套的三元运算符表达式。人为的例子:

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

    就个人而言,你使用哪种风格,或者最容易阅读?

    编辑: (打开何时使用三元运算符)

    我通常避免使用超过2级的深三值运算符。当我在PHP模板脚本中回送变量时,我倾向于使用2级深度三元运算符而不是2级深度三元运算符。

    15 回复  |  直到 14 年前
        1
  •  82
  •   Simon Howard    16 年前

    通常应避免使用三元运算符,但这种形式非常易读:

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

    这样,条件和结果就保持在同一条线上,很容易浏览并理解发生了什么。

        2
  •  76
  •   Tomalak    16 年前

    我尽量不使用三元运算符来编写嵌套条件。它定义可读性,并且在使用条件时不提供额外的值。

    只有当它可以放在一条线上,而且它的意思非常清楚时,我才使用它:

    $value = ($a < 0) ? 'minus' : 'plus';
    
        3
  •  24
  •   biozinc    16 年前

    就我个人而言,我只使用三元运算符,如果它适合一行。如果需要跨越的话,那就到了老好人的时候了

    if else if else
    
        4
  •  13
  •   Chris Jacob    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“不明显的三元行为”解释了以下内容在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
  •  12
  •   nickf    16 年前

    一种风格 有时 我从没有提到过开始就一直在提的用法如下:

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

    但是通常只有把所有的事情都放在一条线上才会让事情变得太长。我发现 = ? : 排成一排使它看起来更整洁。

        6
  •  9
  •   Rick Kierner    16 年前

    三元运算符是编写简单if语句的有效方法。它们不应该嵌套或难以读取。记住:你只写一次软件,但它被读取100次。读起来比写起来容易。

        7
  •  4
  •   Adrian    16 年前

    我倾向于将条件括在括号内:(a==b)?1:0

        8
  •  2
  •   John Rudy    16 年前

    我将持不同意见。我有点像带条件运算符样式的imran。如果它在一条线上很干净,我就把它放在一条线上。如果它不完全适合一行,我会打断它,但是我只使用一个制表符(4个空格;我的vs设置为插入制表符的空格)来缩进。我不会马上跳到 if - else ,因为很多时候条件运算符的上下文意义更大。(但是,如果它没有上下文意义,我只是不使用它。)

    另外,我不嵌套条件运算符。在那一点上,我确实觉得它太难阅读了,是时候更详细地说了 如果 - 其他的 风格。

        9
  •  1
  •   ysth    16 年前

    “人为的例子”是我将如何缩进它,除了我将从左边距缩进,而不是基于上一行中的位置(或任何内容)。

    对于三元批评者来说,可读性是关键。如果您认为它不能使代码更可读,就不要使用它。但我发现至少有一段时间情况恰恰相反。

        10
  •  1
  •   Patrick Szalapski    14 年前

    三元条件可以使代码更干净、更优雅,最重要的是,帮助您将重点放在正确的事情上,避免重复自己。考虑使用它们,但这样做不会降低代码的可读性。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
  •  0
  •   Tim    16 年前

    我不用它。在我看来,它总是像试图节省空间和输入源代码一样,期望较小的源代码==更高效的编译代码。

    我觉得它根本不可读,但大部分是因为我从未使用过它。

        12
  •  0
  •   SmacL    16 年前

    我倾向于不使用三元运算符,因为我发现…否则可读性更高。

        13
  •  0
  •   Yuval F    16 年前

    伊姆兰,你把这个格式化得很漂亮。但是,当嵌套超过两个时,三元运算符确实会变得不可读。if-else块可以为您提供一个额外的可理解嵌套级别。除此之外,使用函数或表驱动编程。

        14
  •  0
  •   stefan2904    16 年前
    $foo = (isset($bar)) ? $bar : 'default';
    
        15
  •  0
  •   Vinze    16 年前

    我个人只使用它来分配一个变量(在Java中),例如:

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

    和(其他示例)在使用不允许空参数的函数时,例如:

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