V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
abcfyk
V2EX  ›  问与答

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

  •  
  •   abcfyk · 2015-09-10 12:20:49 +08:00 · 7067 次点击
    这是一个创建于 3157 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以下代码出自medoo,(php 一个数据库操作类)。总体写得不错,在看源码的时候其中有些写法让我蛋疼。。

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

    能一次过看懂以上代码的码农请举手。。
    第 1 条附言  ·  2015-09-10 18:32:27 +08:00
    好吧,大家的回复我都看了。可能我举的这个例子不太好,只是随手看到一个就 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 条回复    2015-09-10 23:36:52 +08:00
    sandideas
        1
    sandideas  
       2015-09-10 12:22:54 +08:00 via iPhone   ❤️ 3
    让我想起来一个梗。
    a==b?a:b
    leavic
        2
    leavic  
       2015-09-10 12:25:25 +08:00   ❤️ 1
    全世界最好的语言可读性真 tm 高
    laoyur
        3
    laoyur  
       2015-09-10 12:27:16 +08:00   ❤️ 1
    其实还好了,人家还很贴心地把 ? 和 : 单独作为一行
    Felldeadbird
        4
    Felldeadbird  
       2015-09-10 12:30:56 +08:00
    没看出滥用啊。
    shuimugan
        5
    shuimugan  
       2015-09-10 12:32:50 +08:00   ❤️ 1
    三目运算符,凡是超过一行的,或者一行长达 70 个字符左右的,看到一个就重写一个

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

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

    不再多说
    jhdxr
        9
    jhdxr  
       2015-09-10 12:51:18 +08:00
    我也没觉得有什么问题,相比之下如果拆成两个 if 我觉得会更蛋疼些
    cin
        10
    cin  
       2015-09-10 12:52:14 +08:00
    为什么不格式化下代码, 你这样发的帖看一眼就想 x 掉.
    lianyue
        11
    lianyue  
       2015-09-10 13:06:17 +08:00
    还好 来看看我写的。。我找找。。
    // 不需要该表的
    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  
       2015-09-10 13:06:30 +08:00
    在 if 里面里面用 。。。
    ck65
        13
    ck65  
       2015-09-10 13:10:56 +08:00
    medoo 猫不服请大家不要忽略啊 xD
    ChiangDi
        14
    ChiangDi  
       2015-09-10 13:47:47 +08:00
    我讨厌这个三元运算符,除了最简单的情况基本上不用。
    raincious
        15
    raincious  
       2015-09-10 14:00:23 +08:00
    我能看懂……

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

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

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

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

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

    你想要证明这样算滥用,你必须拿出比这个可读性更好的解决方案,不是么?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2256 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 05:39 · PVG 13:39 · LAX 22:39 · JFK 01:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.