函数中 if 是直接返回好,还是包起来好? 不知如何描述,进来看看吧。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请要在回答技术问题时复制粘贴 AI 生成的内容
hao1032
V2EX    程序员

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

  •  
  •   hao1032 2017-09-08 17:01:14 +08:00 5260 次点击
    这是一个创建于 2955 天前的主题,其中的信息可能已经有所发展或是发生改变。
    以下 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  
    nbsp;  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     Solana     2695 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 02:27 PVG 10:27 LAX 19:27 JFK 22:27
    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