大家觉得判断布尔值的时候那种写法更直观? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hauibojek
V2EX    程序员

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

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

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

    32 条回复    2023-12-29 13:51:01 +08:00
    FlashEcho
        1
    FlashEcho  
       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 极力反对 还直观易懂
    QUC062IzY3M1Y6dg
        18
    QUC062IzY3M1Y6dg  
       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  
       2023-12-28 21:19:39 +08:00
    第一种遇到 #define false true 的怎么办?
    param
        21
    param 
       2023-12-29 01:03:21 +08:00 via Android
    看情况。第二种情况,当 flag 为 null 的时候也生效
    leegradyllljjjj
        22
    leegradyllljjjj  
       2023-12-29 08:48:59 +08:00 via Android
    又搁这儿研究茴香豆呢?
    layxy
        23
    layxy  
       2023-12-29 08:55:13 +08:00
    这个得看哪种语言,js 类语言 2 比较好,对于布尔类型有默认值的语言 2 也可以,没默认值 2 可能就不行了
    zzl22100048
        24
    zzl22100048  
       2023-12-29 09:23:53 +08:00
    @V2Q 比如 -》不如
    johnnyyeen
        25
    johnnyyeen  
       2023-12-29 09:52:07 +08:00
    第一种语法描述的更加精确,exactly+specifically ,含义不容易产生歧义。
    forest997
        26
    forest997  
       2023-12-29 10:19:18 +08:00
    @lululau #16 Stream API 好用,但不好 debug
    jifengg
        27
    jifengg  
       2023-12-29 10:24:58 +08:00
    var flag = false;
    if ( flag = false ){
    console.log('=>false');
    }else{
    console.log('=>true');
    }


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

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

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

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

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

    一个!夹杂在大量代码中,确实非常容易遗漏. 所以后面我都改成
    if(false == flag)这种写法
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3167 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:56 PVG 18:56 LAX 03:56 JFK 06:56
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86