V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
fliar
V2EX  ›  PHP

else 和 return,你喜歡哪種?

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

    今天被要求把這段改成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 赞同
    lidashuang
        22
    lidashuang  
       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   ·   实用小工具   ·   4626 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 01:11 · PVG 09:11 · LAX 17:11 · JFK 20:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.