garlics
V2EX  ›  问与答

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

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

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

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


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


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

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

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


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

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

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

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

    ```

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

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