V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hauibojek
V2EX  ›  程序员

大家觉得判断布尔值的时候那种写法更直观?

  •  
  •   hauibojek · 2023-12-28 15:47:14 +08:00 · 2796 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1. if (flag == false) {}
    2. if (!flag) {}

    我一般用 2 的写法,但是今天用一个代码检查工具(oclint)提示 inverted logic 。 其他语言有没有官方的推荐写法

    32 条回复    2023-12-29 13:51:01 +08:00
    chesha1
        1
    chesha1  
       2023-12-28 15:49:07 +08:00
    我喜欢写成 1 ,但是有的 ide 会提示我改成 2 ,尤其是是 pycharm ,clion 好像没这么提示过
    churchill
        2
    churchill  
       2023-12-28 15:51:22 +08:00   ❤️ 1
    THAT MAKE NO SENSE
    ltyj2003
        3
    ltyj2003  
       2023-12-28 15:53:42 +08:00 via Android   ❤️ 10
    我会把 flag 命名为 isXxx ,然后用第二种写法。
    MoYi123
        4
    MoYi123  
       2023-12-28 16:01:09 +08:00   ❤️ 1
    具体的代码是怎么样的?
    inverted logic 看起来像是让你把
    if ( not flag) { A } else { B } 改成
    if (flag) { B } else { A }
    xloger
        5
    xloger  
       2023-12-28 16:02:43 +08:00   ❤️ 1
    我用的 Kotlin ,第一种写法只有在 flag 为可空类型的时候用,这时候理解起来比较直观。
    然后第二种写法,如果是 Kotlin 是可以 if(flag.not()) 的,虽然我觉得 !flag 写法也没啥问题的。有些代码检查我觉得是过度了,单个判断用 ! 我觉得没问题,如果是 !flag && !flag2 这种我才觉得问题比较大。
    Yuanlaoer
        6
    Yuanlaoer  
       2023-12-28 16:08:35 +08:00
    要说直观肯定是第一种,第二种如果把你这里的 flag 取一个更直观的名字,比如 `if (FOO.isAllowed)` 也行

    要说推荐写法的话,可以参考使用较广的语言和开源库的代码,以及公司的代码范式。比如谷歌家几乎各语言都有
    bthulu
        7
    bthulu  
       2023-12-28 16:09:08 +08:00
    当然是第一种更简单直观了
    luzemin
        8
    luzemin  
       2023-12-28 16:10:04 +08:00
    当然是 2
    365473321
        9
    365473321  
       2023-12-28 16:12:16 +08:00
    给 Bool 类型写个扩展:
    extension Bool {

    var isTrue: Bool {
    self == true
    }

    var isFalse: Bool {
    self == false
    }
    }
    thinkershare
        10
    thinkershare  
       2023-12-28 16:15:55 +08:00
    我们公司的统一个规范是一律采用第二种,将第二种理解为不为真,不管什么情形,布尔类型都不与 true/false 比较相等性。
    不过这个纯粹是个人喜好,团队里面约定一个就好了,保证代码风格审查都用统一的就行。
    via
        11
    via  
       2023-12-28 16:17:37 +08:00
    @ltyj2003

    $isFalse = $var === false;

    if ($isFalse === true) {
    // ...
    }
    hauibojek
        12
    hauibojek  
    OP
       2023-12-28 16:19:03 +08:00
    @MoYi123 确实应该是你这个意思。 我误解了
    ltyj2003
        13
    ltyj2003  
       2023-12-28 16:31:32 +08:00 via Android   ❤️ 1
    @via 没太看明白哈,为啥要叫 isFalse ,我想是根据业务来起名,isPowerOn ,isEarthDestroyed 这样子。
    marcong95
        14
    marcong95  
       2023-12-28 16:53:14 +08:00
    !flag 这种写法的感叹号太没存在感了,本来感叹号可能是在各种符号里是最窄的了。但是 flag == false 又感觉太长了,JS 的 linting 里还普遍推荐用===。窃以为还是 Python 的用 and/or/not 关键字代替符号更加合理
    thinkershare
        15
    thinkershare  
       2023-12-28 16:58:52 +08:00
    不过我们最近开始更换为 is true/ is false 这种新写法。
    lululau
        16
    lululau  
       2023-12-28 17:01:34 +08:00
    讲个笑话,曾经有个同事极力反对使用 Java 8 Stream API ,说「 Stream API 比如 for 循环直观易懂」😂
    V2Q
        17
    V2Q  
       2023-12-28 17:04:26 +08:00
    @lululau 极力反对 还直观易懂
    shuxhan
        18
    shuxhan  
       2023-12-28 17:25:43 +08:00
    如果只有一个判断,我会选择 2 ,例如 if(!isMob){},如果多个判断我用 1 ,一层层往下更清晰
    linvaux
        19
    linvaux  
       2023-12-28 18:05:06 +08:00
    习惯用 1 ,第 2 种取反的脑袋还要转一下
    Building
        20
    Building  
       364 天前
    第一种遇到 #define false true 的怎么办?
    param
        21
    param  
       364 天前 via Android
    看情况。第二种情况,当 flag 为 null 的时候也生效
    leegradyllljjjj
        22
    leegradyllljjjj  
       364 天前 via Android
    又搁这儿研究茴香豆呢?
    layxy
        23
    layxy  
       364 天前
    这个得看哪种语言,js 类语言 2 比较好,对于布尔类型有默认值的语言 2 也可以,没默认值 2 可能就不行了
    zzl22100048
        24
    zzl22100048  
       364 天前
    @V2Q 比如 -》不如
    johnnyyeen
        25
    johnnyyeen  
       364 天前
    第一种语法描述的更加精确,exactly+specifically ,含义不容易产生歧义。
    forest997
        26
    forest997  
       364 天前
    @lululau #16 Stream API 好用,但不好 debug
    jifengg
        27
    jifengg  
       364 天前
    var flag = false;
    if ( flag = false ){
    console.log('=>false');
    }else{
    console.log('=>true');
    }


    首先猜猜上面打印的是啥?
    阅读上是第一种比较直观。
    但是编写的时候很容易出现上面这种 bug 。
    而这种情况大部分语言都是支持的所以编译的时候都不会报错。
    tsanie
        28
    tsanie  
       364 天前
    @jifengg 虽然我也会用 2 ,但是一般情况下你说的这种情况编译器会报 warning ,例如 Assignment in conditional expression is always constant; did you mean to use == instead of = ?

    当然不管 warning 那就没救了
    Xhack
        29
    Xhack  
       364 天前
    if(Boolean.TRUE.equals(flag)){
    // ……
    }
    bocchi1amos
        30
    bocchi1amos  
       364 天前
    @ltyj2003 一样,常写 isEmpty ,isNumber ,isxxxx
    xuld
        31
    xuld  
       364 天前
    不管每个人是怎么想的,客观事实上:
    - 写成 flag == false 的好处是:更直观,更容易理解。
    - 写成 !flag 的好处是:更短。此外如果写成 flag == false ,那为了保持对称,是不是也应该用 flag == true

    所以结论很简单:分两类人:
    第一类人理解 !flag 比较吃力,他们会认为 “flag == false 更好理解,推荐用法”
    第二类人觉得理解 !flag 没那么吃力,他们追求更短,以及更利于记忆的对称性(而这些恰恰是第一类人所不能理解的)。

    人的能力本来就是有区别的,强制用 !flag 会让第一类类人不爽(不好理解),强制用 flag == false 会让第二类人不爽(更麻烦了),因此不需要有推荐用法。
    但如果实在需要确定一个团队里的统一写法的话,应该是优先照顾第二类人,因为第二类人才是团队的主力。
    chutianyao
        32
    chutianyao  
       364 天前
    血泪教训,生产环境建议使用 1,养成好习惯.

    某次技改,改动原有代码逻辑,需要将 flag==flase 的判断全部改成 flag==true,但是有些地方使用第二种写法,夹在一大堆代码中遗漏了,CR 也没看出来,造成生产事故.

    一个!夹杂在大量代码中,确实非常容易遗漏. 所以后面我都改成
    if(false == flag)这种写法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2973 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 11:13 · PVG 19:13 · LAX 03:13 · JFK 06:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.