V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sponsored by
LinkedIn
不坐班的神仙工作 · 去任何你想去的地方远程,赚一线城市的工资
2000 个不用出门 Social 的全球远程工作,帮助 V2EX 的小伙伴开启全新的工作方式。
Promoted by LinkedIn
hao1032
V2EX  ›  程序员

函数中 if 是直接返回好,还是包起来好? 不知如何描述,进来看看吧。

  •  
  •   hao1032 · 2017-09-08 17:01:14 +08:00 · 4197 次点击
    这是一个创建于 1848 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以下 2 种方式,哪种更好呢?

    第 1 条附言  ·  2017-09-09 01:42:55 +08:00
    看了各位的选择,很一致。感谢,以后不用纠结了。
    42 条回复    2017-09-10 19:48:02 +08:00
    HongJay
        1
    HongJay  
       2017-09-08 17:06:12 +08:00
    return 的 do something 不知行了吧
    lowzoom
        2
    lowzoom  
       2017-09-08 17:06:13 +08:00
    必须下面的好
    EPr2hh6LADQWqRVH
        3
    EPr2hh6LADQWqRVH  
       2017-09-08 17:08:22 +08:00
    if error then throw up
    yulitian888
        4
    yulitian888  
       2017-09-08 17:16:36 +08:00
    这个问题最大的问题,难道不是“不知如何描述”吗?

    没点进来之前,看标题还以为是这样的情况:

    var result ;
    if(condition)
    {
    resdult =xxx;
    }
    else
    {
    result = yyy;
    }
    return result;

    -------------------------------

    if(condition)
    {
    return xxx;
    }
    else
    {
    return yyy;
    }

    -----------------------------------------
    好吧,答题主,第二种好
    xiaoc19
        5
    xiaoc19  
       2017-09-08 17:16:37 +08:00 via iPhone
    第二种,swift 可以使用 guard else 的方式
    orderc
        6
    orderc  
       2017-09-08 17:19:17 +08:00
    第二种, 错误提前返回
    zhenjiachen
        7
    zhenjiachen  
       2017-09-08 17:21:29 +08:00
    我写 golang 好多地方都是第二种。
    Vindroid
        8
    Vindroid  
       2017-09-08 17:27:56 +08:00
    第二种,第一种 if 里一大段,看着别扭
    flyingghost
        9
    flyingghost  
       2017-09-08 17:46:07 +08:00   ❤️ 1
    第二种。
    函数头部先把参数异常、外部环境异常、内部状态异常等所有非法异常统统处理完。
    接下来安安静静的专心处理函数本身的主体逻辑。

    虽然看起来有点丑,但实用,清晰。
    owenliang
        10
    owenliang  
       2017-09-08 17:47:47 +08:00
    我就想问,重要吗。。
    Cbdy
        11
    Cbdy  
       2017-09-08 17:50:22 +08:00
    go 语言已经给你答案了:先写能提前返回的
    willvvvv
        12
    willvvvv  
       2017-09-08 17:50:40 +08:00
    第二种优先,称之为卫语句

    当出现嵌套判定时,方便梳理逻辑。
    jlsk
        13
    jlsk  
       2017-09-08 18:01:32 +08:00
    我一直觉得第一种好,因为这样可以少打几个字符
    ceflib
        14
    ceflib  
       2017-09-08 18:01:37 +08:00
    《重构 改善既有代码的设计》有讲
    AlisaDestiny
        15
    AlisaDestiny  
       2017-09-08 18:09:58 +08:00
    第二种,嵌套可以少一层。
    xiahei
        16
    xiahei  
       2017-09-08 18:21:32 +08:00
    第二种,early return,一切为了可读性。
    keenwon
        17
    keenwon  
       2017-09-08 18:27:05 +08:00
    明显第二种
    flowfire
        18
    flowfire  
       2017-09-08 18:29:22 +08:00 via Android
    明显卫语句减少嵌套比较好吧
    而且一般卫语句 if 后面推荐不带括号
    momocraft
        19
    momocraft  
       2017-09-08 18:30:43 +08:00
    第一个在你写了很多条件后会变成▶,不 scalable。

    第二个就一直是■,只是长一些。
    lzjV2EX
        20
    lzjV2EX  
       2017-09-08 18:31:21 +08:00
    第二种好
    simon7
        21
    simon7  
       2017-09-08 18:39:40 +08:00 via iPad
    第二种好 第一种会变成 if 嵌套的
    kn007
        22
    kn007  
       2017-09-08 18:41:09 +08:00
    必须第二种
    kn007
        23
    kn007  
       2017-09-08 18:41:34 +08:00
    任何语言,都建议函数先写能返回的。
    ChiangDi
        24
    ChiangDi  
       2017-09-08 18:44:10 +08:00 via iPhone
    学习了
    autoxbc
        25
    autoxbc  
       2017-09-08 18:51:28 +08:00
    就这个例子来说,第一种显然更好

    既不用否命题判断(反直觉),也不用多写一个返回操作(啰嗦)
    iugo
        26
    iugo  
       2017-09-08 18:55:42 +08:00
    我觉得要看 do something 和其他代码的对比.

    如果 do something 是本函数的核心, 那就第二种. 可如果不是呢. 如果 something 只是所有事情中的一部分, 那就另说了.
    happywowwow
        27
    happywowwow  
       2017-09-08 19:01:28 +08:00
    https://coolshell.cn/articles/17757.html
    <如何重构“箭头型”代码>
    iyangyuan
        28
    iyangyuan  
       2017-09-08 19:32:28 +08:00 via iPhone
    异常则中断,规避嵌套,提高可读性,方便扩展
    danielmiao
        29
    danielmiao  
       2017-09-08 19:55:03 +08:00
    第二种,但是不返回,抛异常,或者用 block 语句包围。
    直接返回容易造成调试困难,根本不知道程序从哪个位置退出
    ypcs03
        30
    ypcs03  
       2017-09-09 00:00:59 +08:00 via Android
    必须下面的好,你可以省一个 else
    hao1032
        31
    hao1032  
    OP
       2017-09-09 01:41:48 +08:00 via Android
    @all,学习了,看来不用纠结了,感谢各位。
    misaka20038numbe
        32
    misaka20038numbe  
       2017-09-09 02:12:52 +08:00
    一般是第二种,不过还是要看实际情况。
    mornlight
        33
    mornlight  
       2017-09-09 02:16:48 +08:00
    提早、多用 return,边界清楚。否则以后看代码的时候一堆 else 很容易晕掉。
    kaifeii
        34
    kaifeii  
       2017-09-09 02:58:18 +08:00
    第一种和第二种编译结果应该是一样的,对执行没有影响。
    这个选择只是对可读性的择优。
    AvenirX
        35
    AvenirX  
       2017-09-09 10:11:36 +08:00 via iPhone
    昨天刚刚看到的文章,里面有例子 你可以看看。

    https://mp.weixin.qq.com/s/i5aApAChmqgdxGH4fVu1mA
    RorschachZZZ
        36
    RorschachZZZ  
       2017-09-09 11:42:19 +08:00
    第二种。
    honeycomb
        37
    honeycomb  
       2017-09-09 19:28:52 +08:00 via Android
    @flyingghost 前面先把各种可以或需要排除的问题 guard
    zhx1991
        38
    zhx1991  
       2017-09-09 19:38:56 +08:00
    第二种好

    金字塔式的 if 嵌套让人看的绝望
    RLib
        39
    RLib  
       2017-09-10 09:57:35 +08:00
    那要看你 if 体有多大, 如果就一两句, 无所谓
    liuminghao233
        40
    liuminghao233  
       2017-09-10 16:58:57 +08:00
    肯定第二种
    Sapp
        41
    Sapp  
       2017-09-10 18:40:54 +08:00
    我是喜欢下面的,包括不用 else。
    introom
        42
    introom  
       2017-09-10 19:48:02 +08:00 via Android
    如果第二种实际上后面执行的很短,我坚决第一种。否则第二种。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3828 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 09:38 · PVG 17:38 · LAX 02:38 · JFK 05:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.