V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
abcfyk
V2EX  ›  问与答

大家难道不觉得滥用三元运算符的用法很艹蛋么

  •  
  •   abcfyk · Sep 10, 2015 · 7631 views
    This topic created in 3888 days ago, the information mentioned may be changed or developed.
    以下代码出自medoo,(php 一个数据库操作类)。总体写得不错,在看源码的时候其中有些写法让我蛋疼。。

    foreach ($relation as $key => $value ){
    $joins[] = (
    strpos ($key, '.') > 0 ?
    '"' . str_replace ('.', '"."', $key ) . '"' :
    $table . '."' . $key . '"'
    ) .
    ' = ' .
    '"' . (isset ($match[5]) ? $match[5] : $match[3]) . '"."' . $value . '"';
    }

    能一次过看懂以上代码的码农请举手。。
    Supplement 1  ·  Sep 10, 2015
    好吧,大家的回复我都看了。可能我举的这个例子不太好,只是随手看到一个就 copy 过来了。我再举个详细一点的例子:
    1.比较简单的如下的:
    $values[] = isset ($column_match[0]) ?
    $this->quote (json_encode ($value )) :
    $this->quote (serialize ($value ));

    2.最多我能接受这样的:

    $wheres[] = 0 !== count (array_diff_key ($value, array_keys (array_keys ($value )))) ?
    '(' . $this->data_implode ($value, ' ' . $relation_match[1]) . ')' :
    '(' . $this->inner_conjunct ($value, ' ' . $relation_match[1], $conjunctor ) . ')';

    3. 而我要吐槽的例子是这样的:
    // 一行代码过长的 e.g:
    $where_clause .= ($where_clause != '' ? ' AND ' : ' WHERE ') . ' MATCH ("' . str_replace ('.', '"."', implode ($MATCH['columns'], '", "')) . '") AGAINST (' . $this->quote ($MATCH['keyword']) . ')';

    //e.g: 三元运算符互相嵌套,且内部太多逻辑运算的,下面这个其实格式还算不错的,换行换得比较好:
    $joins[] = (
    strpos ($key, '.') > 0 ?
    // For ['tableB.column' => 'column']
    '"' . str_replace ('.', '"."', $key ) . '"' :
    // For ['column1' => 'column2']
    $table . '."' . $key . '"'
    ) .
    ' = ' .
    '"' . (isset ($match[5]) ? $match[5] : $match[3]) . '"."' . $value . '"';

    如上, medoo 的代码的可读性其实不算差。更厉害的我也见过。。只不过我刚好想起这个问题。。顺手拿了它做反面例子。。 sorry :doge:
    33 replies    2015-09-10 23:36:52 +08:00
    sandideas
        1
    sandideas  
       Sep 10, 2015 via iPhone   ❤️ 3
    让我想起来一个梗。
    a==b?a:b
    leavic
        2
    leavic  
       Sep 10, 2015   ❤️ 1
    全世界最好的语言可读性真 tm 高
    laoyur
        3
    laoyur  
       Sep 10, 2015   ❤️ 1
    其实还好了,人家还很贴心地把 ? 和 : 单独作为一行
    Felldeadbird
        4
    Felldeadbird  
       Sep 10, 2015
    没看出滥用啊。
    slowgen
        5
    slowgen  
       Sep 10, 2015   ❤️ 1
    三目运算符,凡是超过一行的,或者一行长达 70 个字符左右的,看到一个就重写一个

    php 的替代语法也是蛋疼,简直是坑队友神器:
    phpstrom 无法高亮逻辑边界
    netbeans 对于逻辑开始的边界只高亮个冒号,对于代码过长时上下翻动不方便,sublime text 的 BracketHighlighter 插件还好

    但是共同的缺点都是无法直接一个快捷键匹配括号来快捷跳转,都得用肉眼去区分逻辑块
    凡是用了替代语法的,见一个改一个
    chmlai
        6
    chmlai  
       Sep 10, 2015
    又没有嵌套, 这有什么问题.
    catfan
        7
    catfan  
       Sep 10, 2015
    人家明明在源代码换行处还写了注释的...怎么把它给删除了?
    ffffwh
        8
    ffffwh  
       Sep 10, 2015
    if (xx ){yy}else{zz} <-- 这个叫 if 语句
    xx?yy:zz <-- 请称呼为 if 表达式 /条件表达式

    不再多说
    jhdxr
        9
    jhdxr  
       Sep 10, 2015
    我也没觉得有什么问题,相比之下如果拆成两个 if 我觉得会更蛋疼些
    cin
        10
    cin  
       Sep 10, 2015
    为什么不格式化下代码, 你这样发的帖看一眼就想 x 掉.
    lianyue
        11
    lianyue  
       Sep 10, 2015
    还好 来看看我写的。。我找找。。
    // 不需要该表的
    if ($tables && !($table->alias ? in_array ($table->alias, $aliasUse, true ) : ($table->expression || in_array ($table->value, $aliasUse, true ))) && (is_array ($table->column ) && !array_intersect ($table->column, $columnUse ))) {
    continue;
    }
    lianyue
        12
    lianyue  
       Sep 10, 2015
    在 if 里面里面用 。。。
    mogita
        13
    mogita  
       Sep 10, 2015
    medoo 猫不服请大家不要忽略啊 xD
    ChiangDi
        14
    ChiangDi  
       Sep 10, 2015
    我讨厌这个三元运算符,除了最简单的情况基本上不用。
    raincious
        15
    raincious  
       Sep 10, 2015
    我能看懂……

    第一行:判断是否有. <=点
    第二行:如果有,就将字符串组合成"something"."blabla"(话说不应该是`么喂 4 ?)
    第三行:否则,就拼成 table."col"( table 是自己拿参数补的,自己之前已经包好了")

    果然是 PHP 写太多了。
    realpg
        16
    realpg  
    PRO
       Sep 10, 2015
    是不是你把缩进干掉了……
    源代码除了换行还是有缩进的吧……
    有缩进的话看起来不难看啊
    Xrong
        17
    Xrong  
       Sep 10, 2015
    我觉得这个还好吧,又不是嵌了 5 、 6 层
    jin5354
        18
    jin5354  
       Sep 10, 2015
    我觉得用三元运算符节省代码行数完全没有必要
    除了极简单的操作我会用,其他都用 if
    mcfog
        19
    mcfog  
       Sep 10, 2015
    这里主要坑在长字符串拼接吧
    msg7086
        20
    msg7086  
       Sep 10, 2015   ❤️ 1
    首先这里的问题根本不是三元运算符而是字符串拼接。

    $keyformat = ... ? ... : ...;
    $key = sprintf ($keyformat, str_replace (......, $key ));
    $valformat = ... ? ... : ...;
    $val = sprintf ($valformat, $value );
    $joins[] = sprintf ("%s=%s", $key, $val );

    同样是 2 个三元运算符,这样写你看着有困难么?
    neilwong
        21
    neilwong  
       Sep 10, 2015
    @msg7086 对,我感觉也是字符串拼接的问题,不是三元的问题
    fuxkcsdn
        22
    fuxkcsdn  
       Sep 10, 2015
    20 楼+1
    主要是字符串拼接在没代码配色的情况下,看起来很乱
    cxbig
        23
    cxbig  
       Sep 10, 2015
    这里三元运算很短啊,只是这个写法不够美观,可以先运算赋值给变量,再拼 string
    sivacohan
        24
    sivacohan  
    PRO
       Sep 10, 2015 via Android
    @sandideas 不懂这个梗。啥意思?
    zj299792458
        25
    zj299792458  
       Sep 10, 2015 via iPhone
    无论什么情况都等于 a 哈哈哈哈哈
    zj299792458
        26
    zj299792458  
       Sep 10, 2015 via iPhone   ❤️ 1
    @sivacohan 无论什么情况都等于 b 之前说错了
    zjqzxc
        27
    zjqzxc  
       Sep 10, 2015   ❤️ 1
    @sandideas
    a==b?a:b 我想起了另一个更:
    如果和媳妇意见一致,就听我的;如果意见不一致,就听她的。
    aa45942
        28
    aa45942  
       Sep 10, 2015
    三元符很蛋疼+1 ,特别是三元套三元,简直了
    对效率提升没任何效果,对代码可读性影响效果拔群
    abcfyk
        29
    abcfyk  
    OP
       Sep 10, 2015
    @cin 求不借助第三方工具格式化代码方法。
    abcfyk
        30
    abcfyk  
    OP
       Sep 10, 2015
    @laoyur 哈哈,是的。只是顺手举了这个例子。。
    hellokittyer
        31
    hellokittyer  
       Sep 10, 2015 via Android
    要不然就不用 php 了, 233
    xpol
        32
    xpol  
       Sep 10, 2015 via iPad
    单独一个变量存储一下又不会怀孕。
    lincanbin
        33
    lincanbin  
       Sep 10, 2015
    你想要证明这样算滥用,你必须拿出比这个可读性更好的解决方案,不是么?

    你想要证明这样算滥用,你必须拿出比这个可读性更好的解决方案,不是么?

    你想要证明这样算滥用,你必须拿出比这个可读性更好的解决方案,不是么?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1281 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 130ms · UTC 16:52 · PVG 00:52 · LAX 09:52 · JFK 12:52
    ♥ Do have faith in what you're doing.