else 和 return,你喜哪? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fliar
V2EX    PHP

else 和 return,你喜哪?

  •  
  •   fliar 2015-04-01 10:50:55 +08:00 5591 次点击
    这是一个创建于 3915 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天被要求把段改成else
    if(file_exists($fn))
    {
    //printf("it is a file\n");
    $re = $serv->sendfile($fd, $fn);
    //printf("Send %s\n", $re ? "Success" : "Failed");
    return;
    }
    $serv>send($fd, $result);
    改成
    if(file_exists($fn))
    {
    //printf("it is a file\n");
    $re = $serv->sendfile($fd, $fn);
    //printf("Send %s\n", $re ? "Success" : "Failed");
    }
    else
    {
    $serv->send($fd, $result);
    }
    忙分析下哪好,什:)

    28 条回复    2015-04-02 13:09:48 +08:00
    cnhongwei
        1
    cnhongwei  
       2015-04-01 11:01:37 +08:00
    程序当然只有一个出口好。
    yangqi
        2
    yangqi  
       2015-04-01 11:07:09 +08:00
    两个逻辑关系完全不一样的,严格讲当然是if else更加严谨,而且也更加容易明白
    Phariel
        3
    Phariel  
       2015-04-01 11:07:27 +08:00
    多入口单出口,准则。
    zhujinliang
        4
    zhujinliang  
       2015-04-01 11:17:14 +08:00
    带else的好,这个操作跟return没大关系,return可能会对理解有些干扰,再者保不齐之后要加点别的操作呢。。

    一般分支决定return啥的话,会写成
    if (a) {
    return A;
    }
    return B;
    其他情况下不大会省略else
    angelface
        5
    angelface  
       2015-04-01 11:20:16 +08:00
    if else的逻辑性会很好, if (x) return主要是防御性编程, 更多的时候是用来处理代码中的异常分支。
    df4VW
        6
    df4VW  
       2015-04-01 11:32:29 +08:00
    Use a guard clause instead of wrapping the code inside a conditional expression.
    fliar
        7
    fliar  
    OP
       2015-04-01 11:42:40 +08:00
    嘿嘿,其实我是同意@df4VW,不过我还是愿意听听大家怎么说
    我个人觉得一堆if else if无论逻辑性和可读性都不如if return
    至于多入口单出口,抱歉我愚昧不知道这准则,但是我想也不会有人为了这准则都用回goto:)
    有冒犯的话先陪个不是,不好意思啦请不要生气,这个例子其实我想两个不会差很多
    funagi
        8
    funagi  
       2015-04-01 12:02:30 +08:00
    个人以前常用else,现在常用return,偶尔用用else,视具体情况而定,没有绝对的谁优谁劣。
    当执行到return,意味着后面的代码不用浪费时间看了。
    用if return方便把混在一起的逻辑拆开,实现代码块单一职责。
    xylophone21
        9
    xylophone21  
       2015-04-01 12:38:04 +08:00
    如果你的函数有资源回收之类的时,你会发现goto都忍不住用啊. 要不怎么会有do{}while(0)这种呢
    yleo77
        10
    yleo77  
       2015-04-01 13:10:59 +08:00 via iPhone
    以前是 if else, 现在是 return ,以后也return。

    当然不绝对。 这有一定程度上属于编程风格,但我视这种风格的转变为程序员成长的一个小体现。
    invite
        11
    invite  
       2015-04-01 13:35:18 +08:00
    看到标题就想到这个了。
    tsxm
        12
    tsxm  
       2015-04-01 14:35:09 +08:00
    喜欢return,无用逻辑早点结束,不然套的if else太深
    newtonisaac
        13
    newtonisaac  
       2015-04-01 14:40:25 +08:00
    return, 看得清楚比看不清楚好。
    xsseroot
        14
    xsseroot  
       2015-04-01 14:41:48 +08:00
    第二个,逻辑更清晰~
    humiaozuzu
        15
    humiaozuzu  
       2015-04-01 14:44:17 +08:00
    都可以,看语言的动态类型还是静态的。。。
    kk71
        16
    kk71  
       2015-04-01 17:54:41 +08:00
    return
    lepture
        17
    lepture  
       2015-04-01 17:58:34 +08:00
    看你的语言有没有偏好。个人偏好 return early
    Mutoo
        18
    Mutoo  
       2015-04-01 18:06:35 +08:00
    return,及早结束。
    sb
        19
    sb  
       2015-04-01 18:10:58 +08:00
    偏向 if else
    akira
        20
    akira  
       2015-04-01 18:27:26 +08:00
    if else的 代码结构化更好。

    有时候会出现多个退出条件的判断,这种情况下个人更偏向第一种写法。
    xmbaozi
        21
    xmbaozi  
       2015-04-01 18:30:42 +08:00 via Android
    @angelface 赞同
    G2bN4dbX9J3ncp0r
        22
    G2bN4dbX9J3ncp0r  
       2015-04-01 18:31:50 +08:00
    没有return的语言只能用if else了
    cxshun
        23
    cxshun  
       2015-04-01 18:32:04 +08:00
    以前喜欢if else,现在喜欢return,没用的代码早点结束,看着舒服多了,而且嵌套层次也可以少点。
    ellipse42
        24
    ellipse42  
       2015-04-01 23:57:04 +08:00
    raise
    Septembers
        25
    Septembers  
       2015-04-02 03:55:09 +08:00 via Android
    @Phariel
    单出口 大多数情况下会提高代码复杂度
    尽可能降低代码复杂度更为重要

    完成逻辑尽快退出
    执行生命周期过长
    不利于GC优化
    Septembers
        26
    Septembers  
       2015-04-02 03:58:58 +08:00 via Android
    修正 单出口 我是指function内只有一个return
    blue7wings
        27
    blue7wings  
       2015-04-02 09:32:20 +08:00
    我还是比较倾向于第一个的,但是如果有多个if,我更喜欢用goto语句:
    if(file_exists($fn)){
    //printf("it is a file\n");
    $re = $serv->sendfile($fd, $fn);
    //printf("Send %s\n", $re ? "Success" : "Failed");
    goto end;
    }
    if (condition) {
    //something error
    goto end;
    }
    $serv->send($fd, $result);

    end:
    return false;
    有点try-catch的意思了...
    iyangyuan
        28
    iyangyuan  
       2015-04-02 13:09:48 +08:00
    虽然单出口是原则,但我还是觉得有时候用return 可以使代码很简洁易读,读者不必读完整个代码段。尤其是在做参数合法性的时候。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5049 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 135ms UTC 08:30 PVG 16:30 LAX 00:30 JFK 03:30
    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