garlics
V2EX  ›  问与答

使用逻辑运算符代替 if 判断函数执行条件会不会被打?

  •  
  •   garlics · Jan 22, 2019 · 3794 views
    This topic created in 2672 days ago, the information mentioned may be changed or developed.

    有时候只有一句话的判断的时候,不太想写 if,想用逻辑运算符代替,但是感觉这样可读性很差。大家能接受这种写法嘛?

        a && success()
        b || error()
    
    29 replies    2019-01-22 17:33:24 +08:00
    dot2017
        1
    dot2017  
       Jan 22, 2019
    在你认为难读的地方加备注不就好了
    oott123
        2
    oott123  
       Jan 22, 2019 via Android
    这有个术语叫短路求值。
    不能接受。
    frylkrttj
        3
    frylkrttj  
       Jan 22, 2019
    感觉这是神操作
    rockyou12
        4
    rockyou12  
       Jan 22, 2019
    非常不好,一般读这种代码脑袋要转下弯,特别容易出 bug
    jifengg
        5
    jifengg  
       Jan 22, 2019
    一般我写自己用的代码,喜欢这么写。
    如果你的代码还要给别人看或者别人用,那不太推荐。再不然的话,多加点注释,有用的注释
    learnshare
        6
    learnshare  
       Jan 22, 2019   ❤️ 2
    可读性优先
    AlisaDestiny
        7
    AlisaDestiny  
       Jan 22, 2019
    写 js 的话常用。
    比如在调用回调函数的时候 cb && cb(data); 或者为了解决某些兼容性问题的时候 a = a || aa;
    Torpedo
        8
    Torpedo  
       Jan 22, 2019 via Android
    js 里常规操作。。。
    msg7086
        9
    msg7086  
       Jan 22, 2019   ❤️ 2
    你这么写的话可读性就很差了。

    有些语言可以这么写:
    send_email and show_success(xx)
    connect_db or show_error(xx)
    原生英语语法,读起来就很舒服了。
    regist
        10
    regist  
       Jan 22, 2019 via iPhone
    Gentoo 的 ebuild 脚本,一直这么写
    rabbbit
        11
    rabbbit  
       Jan 22, 2019
    一般用来做判断加个注释应该没啥问题

    要是这么写还不加注释估计会被打
    num = (123.45 + 888) / 10 | 0
    num & 1 && num--
    garlics
        12
    garlics  
    OP
       Jan 22, 2019
    @dot2017
    @jifengg
    @rabbbit
    这样写主要为了方便,加注释就更不方便了


    @AlisaDestiny
    @Torpedo
    js 里见到的是 a && a.xxx 比较多,这种调用函数的操作很少


    看了大家的回复,感觉还是乖乖写 if 比较好,@learnshare 说的可读性优先
    mooncakejs
        13
    mooncakejs  
       Jan 22, 2019
    js 和 php 里用的很多,c/java 里很少见。
    lucifer9
        14
    lucifer9  
       Jan 22, 2019
    喜欢这么用的话,投奔 Rust 吧
    and_then, or_else 满足你
    RqPS6rhmP3Nyn3Tm
        15
    RqPS6rhmP3Nyn3Tm  
       Jan 22, 2019 via iPhone
    没有 lazy evaluation 就炸了
    Torpedo
        16
    Torpedo  
       Jan 22, 2019 via Android
    @garlics js 里函数也很多。你要是写 jsx,没有 if,官方还推荐你这么写
    GeruzoniAnsasu
        17
    GeruzoniAnsasu  
       Jan 22, 2019
    拿 c++来说,这种写法有个很严重的问题就是求值要先于运算符

    https://zh.cppreference.com/w/cpp/language/eval_order
    2) 任何运算符的运算数的值计算(但非副效应)先序于运算符结果的值计算(但非副效应)。

    && 右边的 sucess()函数必定会先调用,得出结果后,才会进行&&比较,而如果 success 是个 void 类型,此处甚至无法编译,所以 C/JAVA 里不可能见到这种写法,语义上都无法成立


    只在 shell 脚本里见过 [ xxx ] && do_sth
    nichijou
        18
    nichijou  
       Jan 22, 2019
    像 if else 本身是英语,其语义不需思考已经形成条件反射了

    而这种写法在如果该语言很常见比如 Perl,因为用得多所以可以放心使用

    但如果该写法在该语言不常见的话还是不要了,别人看了可能会懵一下
    sosilver
        19
    sosilver  
       Jan 22, 2019 via Android
    @GeruzoniAnsasu 并不是,你看第六条。短路逻辑运算符类似 if/else。
    GeruzoniAnsasu
        20
    GeruzoniAnsasu  
       Jan 22, 2019
    @sosilver 试完发现我说错了
    maomo
        21
    maomo  
       Jan 22, 2019
    会不会被打取决于看代码的人喜不喜欢做逻辑题
    jookr
        22
    jookr  
       Jan 22, 2019
    我拍黄片经常这么写
    ```
    !$var && $this->error('报错');
    $insert['name'] = input('post.name/s') ?: $this->error('name 获取失败');
    ```
    U7Q5tLAex2FI0o0g
        23
    U7Q5tLAex2FI0o0g  
       Jan 22, 2019
    if (a) {
    success();
    }
    可以说我今天写了 3000 行代码。
    a && success()
    只能说我今天写了 1000 行代码。

    (狗头
    arthas2234
        24
    arthas2234  
       Jan 22, 2019
    比较忙或者脑子不太清醒的时候,容易翻车
    shyangs
        25
    shyangs  
       Jan 22, 2019
    JS 里常规操作

    ```

    var locale = navigator.language || navigator.browserLanguage;

    ```
    meiguo10086
        26
    meiguo10086  
       Jan 22, 2019
    js 常见 不会被打。不过还是建议用 if 抱起来 多不了多少代码。但是很优雅可读性高。貌似很多大佬都建议包起来
    grewer
        27
    grewer  
       Jan 22, 2019
    我也 觉得是常规操作 习惯了之后 可读性不是问题 写得也快点..
    jsq2627
        28
    jsq2627  
       Jan 22, 2019
    JS 的常规操作,特别是空值检测和 JSX 里面条件分支
    libook
        29
    libook  
       Jan 22, 2019
    可读性优先,不推荐这么写。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3221 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 126ms · UTC 14:48 · PVG 22:48 · LAX 07:48 · JFK 10:48
    ♥ Do have faith in what you're doing.