您对三元运算符使用哪种编码风格? [关闭]

Posted

技术标签:

【中文标题】您对三元运算符使用哪种编码风格? [关闭]【英文标题】:Which coding style you use for ternary operator? [closed] 【发布时间】:2010-09-19 14:00:15 【问题描述】:

如果它很短,我会将它放在单行中。最近我一直在使用这种风格来处理更长的或嵌套的三元运算符表达式。一个人为的例子:

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

您个人使用哪种风格,或者觉得最易读?

编辑: (关于何时使用三元运算符)

我通常避免使用超过 2 级的深度三元运算符。当我在 php 模板脚本中回显变量时,我更喜欢 2 级深三元运算符而不是 2 级 if-else。

【问题讨论】:

暂时标记了这个 PHP,但我不确定这是语言。 是的。我没有将其标记为 PHP,因为该主题适用于所有具有类 C 语法的语言 添加了与语言无关的(因为它是)但保留了 php(因为示例是)。 这对于 *** 来说并不是一个很好的格式(请参阅 the FAQ,因为它不能有一个“正确”的答案。你可能在 Programmers SE 上运气更好。 尝试在Code Review提问。 【参考方案1】:

三元条件可以让代码更简洁、更优雅,最重要的是,帮助你把重点放在正确的事情上,避免重复自己。考虑使用它们,但这样做不会降低代码的可读性。在 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

请注意,“它的可读性较差”与“我不习惯看到那个”不同。

【讨论】:

【参考方案2】:

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!

【讨论】:

注意! PHP 中的嵌套三元组是一个棘手的问题。可能建议避开它们,但我们都喜欢与棘手的骰子。【参考方案3】:

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

对于三元批评者 - 可读性是重点。如果您认为它不会产生更具可读性的代码,请不要使用它。但我发现至少在某些时候情况恰恰相反。

【讨论】:

【参考方案4】:

有时使用的一种风格,因为它没有被提及,所以我提出来,是这样的:

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

..但通常只有在将它们全部放在一行上会使其太长时。我发现将= ? : 全部排好会让它看起来更整洁。

【讨论】:

我的样式是一样的,只是我没有把它们排成一行(我只用制表符缩进,我不把制表符和空格混在一起,IMO 风格不好)。【参考方案5】:

我尽量不使用三元运算符来编写嵌套条件。它违背了可读性,并且与使用条件相比没有提供额外的价值。

只有当它可以放在一行上,并且它的含义非常清楚时,我才使用它:

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

【讨论】:

100% 同意。并且仅当运算符用作单个语句且仅当它少于 80 个字符时,包括缩进。在之前的雇主中,之前的首席开发人员喜欢在 1k echo 语句的中间使用三元运算。邪恶。我完全禁止在该代码库中使用它。 我将我的 if 块与其替代的三元语句进行了比较,当三元有一些格式(括号、间距等)时,它比我的 if 块大 20 个字节,并且它几乎无法阅读。当我优化三元(而不是 if 块)时,它只比 if 块小两个字节,甚至比以前更不可读。 嵌套三元运算符很容易被嘲笑,但如果您正在编写 Automapper 配置并且需要 Linq-to-SQL 支持的表达式,那么它们突然看起来还不错。 【参考方案6】:

我个人仅将它用于变量的赋值(在 java 中),例如:

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

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

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

【讨论】:

【参考方案7】:
$foo = (isset($bar)) ? $bar : 'default';

【讨论】:

【参考方案8】:

一般要避免使用三元运算符,但这种形式可读性很强:

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

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

【讨论】:

如果我必须以这种方式使用它,我会使用 switch 语句。 在这种特殊情况下,您可以使用 switch 语句,因为它们是 == 比较,但它们可以是任何表达式。在一般情况下,switch 语句并不总是可行的。 @rmeador:那么你在想像 lisp 的 COND 之类的东西吗? (setq foo 3) (cond ((>= foo 4) 'result1) ((= foo 3) 'result2) ((= foo 2) 'result3) (( 这个结构需要更多的括号才能在 PHP 中正常工作! “通常要避免使用三元运算符” - 为什么?这似乎更像是一种意见,而不是规则。在 if-else 看起来有点矫枉过正的许多情况下,三元运算符是一个有用的工具。也许我们也应该避免使用 PHP,因为人们也不知道如何正确使用它?【参考方案9】:

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

【讨论】:

【参考方案10】:

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

【讨论】:

为什么?运算符有优先级(优先级)。对于C++,PHP,... 更容易从真/假语句中辨别条件。我在代码中的所有条件周围都加上了括号。【参考方案11】:

我会反对普遍的看法。我有点像 Imran 的条件运算符风格。如果它干净地放在一条线上,我将它放在一条线上。如果它不完全适合一行,我会打破它,但我只使用一个制表符(4 个空格;我将 VS 设置为为制表符插入空格)用于缩进。我不会立即跳到if-else,因为很多时候条件运算符在上下文中更有意义。 (但是,如果它在上下文中没有意义,我根本不使用它。)

另外,我不嵌套条件运算符。在这一点上,我确实觉得它太难阅读了,是时候使用更冗长的if-else 样式了。

【讨论】:

【参考方案12】:

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

【讨论】:

可读性为王,IMO。我喜欢这句话。【参考方案13】:

就个人而言,我只在适合一行的情况下使用三元运算符。如果它需要跨越,那么是时候为好老了

if else if else

【讨论】:

【参考方案14】:

我倾向于根本不使用三元运算符,因为我发现 if .. else 更具可读性。

【讨论】:

【参考方案15】:

我不使用它。我总是觉得试图节省空间和输入源代码,期望小源代码 == 更高效的编译代码。

我觉得它根本不可读,但这主要是因为我从不使用它。

【讨论】:

嘿。这已经死定了,整个态度贯穿于 C 的设计中。数组 == 指针、逗号运算符以及前后递增和递减运算符是其他出色的示例。这也是我认为艾达更好的原因之一。它旨在生成可维护的代码

以上是关于您对三元运算符使用哪种编码风格? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

奇怪的行为三元运算符[关闭]

为啥 Go 没有三元条件运算符 [关闭]

Scala 程序中的三元运算符使用 [关闭]

C# 中哪个三元运算符最流行和最常用? [关闭]

为啥 Kotlin 不支持“三元运算符”[关闭]

三元运算符 '?:' 在 4.9.0 之前的 GCC 版本中推断出不正确的类型? [关闭]