只有我习惯写 if (true == file.exists()) 这样的代码吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
xiusedelang
V2EX    程序员

只有我习惯写 if (true == file.exists()) 这样的代码吗?

  •  
  •   xiusedelang 2015-09-30 19:51:40 +08:00 8792 次点击
    这是一个创建于 3682 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我感觉这样代码看着有莫名的对称美感。虽然多打点字,但是看代码时逻辑更容易理解。
    只有我这样觉得吗?

    67 条回复    2015-10-05 15:11:48 +08:00
    xmbaozi
        1
    xmbaozi  
       2015-09-30 19:56:04 +08:00
    file.exists() == true
    怎么觉得这样更符合逻辑
    lsmgeb89
        2
    lsmgeb89  
       2015-09-30 19:56:15 +08:00   2
    if (file.exists())

    if (!file.exists())
    blacktulip
        3
    blacktulip  
       2015-09-30 19:57:53 +08:00
    英语而论 if file exists 显然更流畅
    render
        4
    render  
       2015-09-30 19:58:16 +08:00
    这样写多此一举,没意义。
    vietor
        5
    vietor  
       2015-09-30 19:58:37 +08:00 via Android
    把缺点美化成优点。之前国内有些人写的编程类的书中推荐的方法、风格很多都是坑人的。
    lsmgeb89
        6
    lsmgeb89  
       2015-09-30 19:59:16 +08:00
    @xmbaozi 是防止少写一个等号,造成 bug 。所以写在左边,这样如果少写了,就会编译错误。它还有个名字叫 Yoda 表示法,见:
    http://www.yinwang.org/blog-cn/2013/04/14/yoda-notation/
    aprikyblue
        7
    aprikyblue  
       2015-09-30 20:00:17 +08:00
    多此一举,而且实在看不出 哪里逻辑更容易理解。。。

    还是习惯这样
    > if ( file.exists() )
    jydeng
        8
    jydeng  
       2015-09-30 20:01:05 +08:00
    true 和 false 从来不写,都是 if(条件) 、 if(!条件)。
    zenjayjay
        9
    zenjayjay  
       2015-09-30 20:01:29 +08:00
    true 写在前面是好的,不过语义化应该是“如果存在”,那个 true 就没必要写了吧。
    echo1937
        10
    echo1937  
       2015-09-30 20:03:30 +08:00
    其实是你习惯了而已,就好比 “朱逸之” 这样的名字。
    YuJianrong
        11
    YuJianrong  
       2015-09-30 20:07:39 +08:00
    Yoda 表示法现在来看毫无意义,阅读起来明显 变量 == 常亮 更符合人类阅读习惯。至于写错的问题,现代软件开发的编译器或者语法检查器早就能解决这种无聊的问题了……
    wdlth
        12
    wdlth  
       2015-09-30 20:09:12 +08:00
    以前总有人说 value == false 应该写成 false == value ,这样就算写成了一个=, value 不会被赋值。
    不过很多 IDE 是不允许在判断时写一个=的,还有 Java 、 Python 等语言可以用 equals 、 is 等方法判断,看来还是要与时俱进。
    88250
        13
    88250  
       2015-09-30 20:11:33 +08:00 via Android
    看你们讨论,我又写了几行。
    suduo1987
        14
    suduo1987  
       2015-09-30 20:12:14 +08:00 via iPhone
    null==?, true 不写
    Quaintjade
        15
    Quaintjade  
       2015-09-30 20:13:51 +08:00
    我觉得 Yoda conditions 中文可以翻译成智叟表示法(甚矣,汝之不惠)。。。
    samael
        16
    samael  
       2015-09-30 20:34:57 +08:00
    @vietor 0bug 是吧?:D
    zjqzxc
        17
    zjqzxc  
       2015-09-30 20:40:24 +08:00
    if(file.exists()) ...;
    else ...;

    如果文件存在执行...;否则的话执行...
    多自然语言~~一边说中文一边写。
    matthewgao
        18
    matthewgao  
       2015-09-30 20:58:20 +08:00
    这个逻辑还没复杂到需要这样写,这么简单的直接写就好
    crazystory
        19
    crazystory  
       2015-09-30 21:03:06 +08:00   2
    看到有人说 if 写一个等号会有 IDE 提示错误的我也是醉了。在支持多种语言的 IDE 下,是否提示错误是根据语言来的。比如 if ($a = 1)这种语法在 php 中属于合法的,IDE 并不会提示错误, IDE 会提示错误,但在 golang 中这样写是会直接报错的。所以结论就是 yoda 并是一竿子打死的的无意义,在某些语言里还是有重大意义的
    crazystory
        20
    crazystory  
       2015-09-30 21:03:43 +08:00
    建议多去了解一下其他语言的规范再来说某种写法是否有意义
    hunterzhang86
        21
    hunterzhang86  
       2015-09-30 21:12:02 +08:00
    @YuJianrong 正解
    dorentus
        22
    dorentus  
       2015-09-30 21:14:39 +08:00 via iPad
    @crazystory PHP 的 IDE 太多了我不知道, Objective-C 也一样,赋值表达式是有值的,并且大部分类型的值可以隐式转化为布尔值,于是你那种写法也是合法的语句,但是正常配置的 Xcode 还是会给一个警告。

    我写这么多只是想说,和语言规范无关,编译器或者 IDE 只要想做到,就完全可以给用户可能出错的代码以警告。
    xcv58
        23
    xcv58  
       2015-09-30 21:15:58 +08:00 via iPhone
    反正编译器会给你优化掉
    lincanbin
        24
    lincanbin  
       2015-09-30 21:18:22 +08:00
    反正我在 PHP 中习惯这么写,并且还是用强类型比较符===,很多函数都是返回 mixed 。
    只要有值,不一定是 bool true ,都能使 if 成立。
    ncwhale
        25
    ncwhale  
       2015-09-30 21:41:18 +08:00
    @lincanbin 那是因为 PHP 是世界上最好的语言啊喵~
    zmj1316
        26
    zmj1316  
       2015-09-30 21:44:32 +08:00
    @lsmgeb89 这应该是在没有 Bool 类型的时候或者比较常量的时候才使用,如果语言支持 bool 类型那就是多此一举
    ryd994
        27
    ryd994  
       2015-09-30 22:04:19 +08:00
    gcc warning 妥妥的
    fengxiang
        28
    fengxiang  
       2015-09-30 22:05:51 +08:00 via Android
    true,false =false,true
    zhujinliang
        29
    zhujinliang  
       2015-09-30 22:44:03 +08:00
    if (脱裤子 == 放屁())
    刚才脑中突然出现这句话,然后自己被自己逗笑了。。。

    话说印象中以前 Basic 要写 if Something = false then ... 而不是 if !Something then ,具体怎么回事记不清了,或许是某些 Basic 解释器只认 if ... = ... then 的形式,也可能是我记错了
    huanglexus
        30
    huanglexus  
       2015-09-30 23:10:39 +08:00   1
    你这就和 if (true) return true else return false 差不多...
    RemRain
        31
    RemRain  
       2015-09-30 23:23:00 +08:00   1
    不是应该写成 if (false != file.exists()) 吗?

    另外推荐这么写: if (false xor file.exists()),除了有莫名的对称美感外,还有莫名的专业感~
    blue7wings
        32
    blue7wings  
       2015-09-30 23:26:18 +08:00
    这个是很久以前的方式了,《编写可执行代码》一书中,还专门说了这个问题,现在已经不提倡这么些了,影响代码的阅读,虽然自己看着舒服,如果别人看的话就莫名的难受了。
    mimzy
        33
    mimzy  
       2015-09-30 23:38:28 +08:00
    《编写可读代码的艺术》里提到了这个问题:
    「比较的左侧:“被问询的”表达式,它的值更倾向于不断变化。比较的右侧:用来做比较的表达式,它的值更倾向于常量。」
    「这条指导原则和英语的用法一致。我们会很自然地说:“如果你的年收入至少是 10 万美元”或者“如果你不小于 18 岁。”而“如果 18 岁小于或等于你的年龄”这样的说法却很少见。」
    「遗憾的是,这种顺序的改变使得代码读起来很不自然(就像电影《星球大战》里的尤达大师的语气:“除非对此有话可说之于我”)。庆幸的是,现代编译器对 if (obj = NULL) 这样的代码会给出警告,因此“尤达表示法”是已经过时的事情了。」
    mornlight
       
    mornlight  
       2015-10-01 00:30:08 +08:00
    我们的编码规范里直接禁止写 == YES 这种
    vikeria
        35
    vikeria  
       2015-10-01 08:09:31 +08:00 via Android
    看着不觉得蛋疼吗?
    gamexg
        36
    gamexg  
       2015-10-01 09:17:34 +08:00
    python 表示少一个=号直接报错。
    tushiner
        37
    tushiner  
       2015-10-01 11:28:11 +08:00
    判断布尔类型值不用这样,判断数据值和类型是否相等用 equal ,直接用"=="在面向对象语言中的应用越少越好
    oska874
        38
    oska874  
       2015-10-01 12:21:28 +08:00
    题主 C 出身吧。
    pseudo
        39
    pseudo  
       2015-10-01 12:25:14 +08:00
    @echo1937 请问朱逸之是个什么梗,一直没弄清楚
    angkec
        40
    angkec  
       2015-10-01 13:07:45 +08:00
    @pseudo 猪一只?
    ekousp
        41
    ekousp  
       2015-10-01 13:19:52 +08:00
    这样写 code review 不会通过的哟。
    chiu
        42
    chiu  
       2015-10-01 14:00:12 +08:00
    @xmbaozi 一般把常量放在左边,这样在“==”误打成“=”的情况下,编译器会报错。
    honeycomb
        43
    honeycomb  
       2015-10-01 14:17:53 +08:00 via Android
    @chiu 这个习惯没坏处
    chmlai
        44
    chmlai  
       2015-10-01 15:29:27 +08:00
    这种写法没任何好处.
    搞不好还会出来 N 多变种:
    ```
    if (true == file.exists())
    if (true != file.exists())
    if (false == file.exists())
    if (false != file.exists())
    ```
    hualuogeng
        45
    hualuogeng  
       2015-10-01 16:43:02 +08:00
    我只有在==的情况下才把常量写在左侧。
    noli
        46
    noli  
       2015-10-01 17:35:00 +08:00
    这种情况 ( == 右边是中间变量的情况下)即使反过来写并且少打了一个等于号,绝大多数语言的编译器都是会 complain 的吧? 所以这么写完全没有意义。
    pseudo
        47
    pseudo  
       2015-10-01 19:03:21 +08:00
    @angkec 谢谢原来是这个 OTL
    echo1937
        48
    echo1937  
       2015-10-01 22:59:30 +08:00
    @pseudo "猪一只"啊,“朱逸之” 这取名外表看着非常大气有才学吧,实际就是个蠢主意。
    abscon
        49
    abscon  
       2015-10-01 23:03:12 +08:00 via iPhone
    如果真的是存在文件
    --------
    楼主你平时这样说话?
    crazystory
        50
    crazystory  
       2015-10-01 23:13:38 +08:00
    @dorentus 合法的语法为何要警告。这不是多此一举。 就是需要这样写呢。
    thxmem
        51
    thxmem  
       2015-10-01 23:15:34 +08:00
    记得有书推荐这种写法,不过看起来很别扭。
    anjouslava
        52
    anjouslava  
       2015-10-02 00:16:20 +08:00
    @crazystory 合法的语法也会警告,因为在条件判断的地方写赋值语句是明显的无意义错误,高级 IDE 设计的时候就考虑到了
    legendlee
        53
    legendlee  
       2015-10-02 01:45:56 +08:00 via Android
    我的习惯是:
    bool 类型和指针的判断不用==号,直接 if ( file.valid())和 if(ptr)。
    其他类型的使用常量==变量的形式。
    gladuo
        54
    gladuo  
       2015-10-02 01:56:01 +08:00
    这个逼装的已经不流行了
    orzfly
        55
    orzfly  
       2015-10-02 10:48:13 +08:00 via Android
    @crazystory 我见过的一些 IDE / 编译器是你再套一层括号,比如 if ((result = someMagic())) 他就不给你警告了……
    limuxy
        56
    limuxy  
       2015-10-02 13:17:38 +08:00 via Android
    到底对称在哪里……
    nozama
        57
    nozama  
       2015-10-02 18:34:02 +08:00 via Android
    我发现很多人自己根本不思考,书上说这样,就必须这样... 还有一种奇葩习惯是,任何指针使用前都加一句 if(ptr)…, 但是又忽略 else 的情况,结果虽然临时避免了 bug ,却隐藏了更多 bug
    CRVV
        58
    CRVV  
       2015-10-02 23:22:53 +08:00
    @crazystory
    建议自己把代码写出来用编译器编译一下再来说事
    “合法的语法为何要警告”... 你是只写过 Go 么
    警告就是在合法的语句里找不合适的地方

    C 语言用 ‘ gcc -Wall ’ 编译,会对 if(a=1)给 Warning
    adonishong
        59
    adonishong  
       2015-10-03 11:54:40 +08:00
    楼主自己没发现这个写法最大的好处?这个写法最大的好处是如果把 if (true == file.exists()){} 错写成 if (true = file.exists()){}的时候,编译器会报错,编译直接过不去;如果是 if (file.exists() == true){}少写一个等号,编译器不会出错,跑起来会有不定期的错误,并且不太好查。。。
    adonishong
        60
    adonishong  
       2015-10-03 11:56:56 +08:00
    @lincanbin

    re 。。。转到 php 之后,掉了几次坑,然后就习惯写===和!==了
    yuchting
        61
    yuchting  
       2015-10-03 16:38:30 +08:00
    这样的代码感觉有点蛋疼,之前遇到过老程序员看不管?:的语法,非得 if else
    hjkl0001
        62
    hjkl0001  
       2015-10-03 16:53:56 +08:00
    这样看着感觉不习惯,一直 if(file()) or if(!file())
    secondwtq
        63
    secondwtq  
       2015-10-03 23:05:33 +08:00   1
    我认为语言本身设计存在的某些问题和缺陷,锅应该让编译器和工具链来背,而不应该让你和阅读你代码的人来背。
    Geoion
        64
    Geoion  
       2015-10-04 00:06:42 +08:00
    传说中的布林表达式?
    jedihy
        65
    jedihy  
       2015-10-04 14:03:52 +08:00
    写 C 都是这样写的,怕写成等于。原来项目中出过这样的错之后,就都这样写了。

    其实很大经典的库内部的代码风格也是这样( C )。
    dqh3000
        66
    dqh3000  
       2015-10-04 17:43:12 +08:00
    我倒是有以后会想写
    if (exists() == true)

    我当然知道 true==exists()是避免把==写成=,但是正如楼上所说,这样毕竟和自然语言理解差别太大

    然而我有时候觉得觉得如果写 if(exists())这样,不仔细看的话,可能会跟 if(!exists())弄混,更何况还可能有 if(notExists())和 if(!notExists())或者类似的东西
    abscon
        67
    abscon  
       2015-10-05 15:11:48 +08:00 via iPhone
    @dqh3000 写成 if( !exists() )就不会弄混了,感叹号前空一格,后面紧挨标识符。

    把否定词弄到标识符里不是好主意
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1188 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 48ms UTC 17:51 PVG 01:51 LAX 10:51 JFK 13:51
    Do have faith in what you're doing.
    ubao msn 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