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

据说优秀的代码没有 else?

  •  1
     
  •   GoPHP · 2018-04-18 18:53:08 +08:00 · 16449 次点击
    这是一个创建于 2193 天前的主题,其中的信息可能已经有所发展或是发生改变。

    多个 if else 嵌套的代码估计大家都见过。。。头疼!

    但是其实很多 if else 可以简化成一个 if,不需要 else,举个例子:

    $books = getByAFunc()
    if($books) {
       do something ...
       return something
    }else {
       do something ....
       return something
    }
    

    看上去没什么毛病,但是根据业务需求,大部分是可以这么写:

    if($books) {
         do something...
         return something
    }
    do something...
    return something
    

    这只是举个例子,很多时候满足条件的只有一种情况,那我们就可以针对这一种情况处理,其他情况直接 return !

    还要一种写法是先处理可能出现的异常错误,然后最后执行下来的就是正确情况!

    147 条回复    2018-04-20 21:07:11 +08:00
    1  2  
    natscat
        101
    natscat  
       2018-04-19 16:49:08 +08:00   ❤️ 1
    我觉得程序里面应该把每一种可能的执行路径都写清楚
    所以我是支持 if...else...这种的
    lightening
        102
    lightening  
       2018-04-19 17:17:45 +08:00   ❤️ 1
    看情况。如果 if 是作为过滤掉一些非正常情况,那么早早 return 掉是可以接受。如果本来就是两种需要正常处理的情况,当然是 if ... else 更清晰。
    floyda
        103
    floyda  
       2018-04-19 17:17:48 +08:00
    优秀的代码没有 if 的
    afpro
        104
    afpro  
       2018-04-19 17:21:56 +08:00
    优秀的代码不拘泥于有没有 if 这种细节 整体的可读性更重要
    dayoushen
        105
    dayoushen  
       2018-04-19 17:22:00 +08:00   ❤️ 1
    支持 if-else 匹配,但不支持 if-else if-else if ..-else
    如下:
    char *p = new char[10];
    if(condition == true)
    {
    do_something()
    delete []p;
    p = NULL;
    return some;
    }
    do_else();
    delete []p;
    p = NULL;
    return some;
    你要释放两次指针,只有 if 容易内存泄漏。完美 if-else
    bool bRet;
    char *p = new char[10];
    if(condition == true)
    {
    do_something()
    bRet = true;
    }
    else
    {
    do_else()
    bRet = false;
    }
    do_else();
    delete []p;
    p = NULL;
    return bRet ;
    hslx111
        106
    hslx111  
       2018-04-19 18:57:42 +08:00
    else 可以有,但是多层嵌套不应该
    awing
        107
    awing  
       2018-04-19 19:03:04 +08:00   ❤️ 1
    是时候祭出这段代码了
    ```python
    elif (rootKey == "mode"):
    # Capitalize it just for good measure
    value = value.upper()
    if (value == "LOITER"):
    self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("LOITER")
    elif (value == "STABILIZE"):
    self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("STABILIZE")
    elif (value == "ALT_HOLD"):
    self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("ALT_HOLD")
    elif (value == "GUIDED"):
    self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("GUIDED")
    elif (value == "AUTO"):
    self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("AUTO")
    elif (value == "RTL"):
    self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("RTL")
    elif (value == "BRAKE"):
    self.vehicleWrapper.vehicle.mode = dronekit.VehicleMode("BRAKE")
    else:
    ```
    MasterC
        108
    MasterC  
       2018-04-19 19:06:35 +08:00
    @awing #107 为什么不用 switch case
    guog
        109
    guog  
       2018-04-19 19:19:36 +08:00 via Android
    @MasterC Python🌚
    hansight2018
        110
    hansight2018  
       2018-04-19 19:33:30 +08:00 via Android
    refer to "guard clause"
    bobuick
        111
    bobuick  
       2018-04-19 19:36:19 +08:00
    什么鬼。
    反了吧,优秀的代码应该要有 else, 如果没 else 说明这个 if 可以再抽象到一个函数里去。 如果是简单的 if, 应该是存在三元表达式的方式表达。
    MeteorCat
        112
    MeteorCat  
       2018-04-19 20:47:43 +08:00
    涉及业务多的时候,你就知道了
    ww2000e
        113
    ww2000e  
       2018-04-19 20:59:44 +08:00
    优秀程序员 tab 是 8 个空格
    yanyuechuixue
        114
    yanyuechuixue  
       2018-04-19 22:49:39 +08:00
    认同一部分吧, 如果是发生了某条件需要做一件事, 而不发生的时候不需要做, 那么最好不用 else 只用 if, 提升效率. 而且最好 if 的条件为真的概率要更大.

    如果需要分开处理, 那还是用 else 吧. 避免不了的.(当然你要说用两个 if 的话我没话说, 但效率会下降吧?我猜.)
    Chingim
        115
    Chingim  
       2018-04-20 00:51:13 +08:00


    求比较, 求更优雅的方案
    akira
        116
    akira  
       2018-04-20 01:00:20 +08:00
    @Chingim 根据与或关系应该是可以获得 0-3,4 个数字
    Chingim
        117
    Chingim  
       2018-04-20 01:03:33 +08:00 via Android
    @akira show your code
    elvodn
        118
    elvodn  
       2018-04-20 01:18:08 +08:00
    @Chingim 错误排除用 early return,双分支 if...else... 多分支应该用 switch 吧
    ``` go
    func getPlanDone(isSunny, isHappy bool) {
    switch {
    case isSunny && isHappy:
    println("plan-A-step-1")
    println("plan-A-step-2")
    case isSunny:
    println("plan-B-step-1")
    println("plan-B-step-2")
    case isHappy:
    println("plan-C-step-1")
    println("plan-C-step-2")
    default:
    println("plan-D-step-1")
    println("plan-D-step-2")
    }
    }
    ```
    MrGba2z
        119
    MrGba2z  
       2018-04-20 01:47:28 +08:00   ❤️ 1
    优秀的代码没有 if
    优秀的代码只有优秀的客户才配用 只有一种可能 没有任何 if 没有任何异常 如果发生了 那么就是客户不够优秀
    akira
        120
    akira  
       2018-04-20 01:57:15 +08:00
    @Chingim 满足你的愿望。

    function getPlanDone(isSunny, isHappy)
    {
    var steps = ["D","B","C","A"];
    var c = isSunny + isHappy * 2;

    console.log( 'plan-' + steps[c] + '-step-1' );
    console.log( 'plan-' + steps[c] + '-step-2' );
    }

    getPlanDone( true, true); //A
    getPlanDone( true, false); //B
    getPlanDone( false, true); //C
    getPlanDone( false, false); //D

    PS , 这种过于技巧性的代码不建议在日常工作使用。其实你的第二种写法就非常好了
    akira
        121
    akira  
       2018-04-20 02:01:23 +08:00
    @elvodn 没看过 go,好奇的问下,若 isSunny, isHappy 都为真,那么这个 switch 的前 3 个表达式的值都是真。这种情况下 switch 是怎么区分的呢
    elvodn
        122
    elvodn  
       2018-04-20 02:14:17 +08:00
    @akira go 里 switch 是默认 break 的
    goinghugh
        123
    goinghugh  
       2018-04-20 09:29:33 +08:00
    @awing python 可以用字典的方式实现 switch case
    zhouquan03
        124
    zhouquan03  
       2018-04-20 09:43:53 +08:00
    强烈反对写 if 不写 else
    LZ 多写代码就会发现漏了 else 逻辑多么可怕
    EanCuznaivy
        125
    EanCuznaivy  
       2018-04-20 09:56:06 +08:00
    有些 IDE 会提示你有不必要的 else ……
    loveour
        126
    loveour  
       2018-04-20 10:06:47 +08:00
    @zhouquan03
    赞同。不明白非得不要 else 意义何在。。
    pmispig
        127
    pmispig  
       2018-04-20 10:22:27 +08:00
    优秀的代码必须有 else,证明你有考虑到这种情况。
    hatcloud
        128
    hatcloud  
       2018-04-20 11:36:10 +08:00
    @loveour
    其实不是反对 else 而是 else 带来的嵌套问题,就一层的话我觉得没什么问题。
    我的理解是多层 if-else 很容易使代码呈现树状结构,很不易于他人阅读,而事实上大部分情况下,多层嵌套的 if-else 都可以通过 if-return 来替换成比较线性的代码。
    @Chingim #115 的例子就很好
    satanandroid
        129
    satanandroid  
       2018-04-20 11:58:47 +08:00
    可读性好 逻辑清晰 就是优秀的代码。
    和什么 else 不 else 一点关系都没
    lloovve
        130
    lloovve  
       2018-04-20 12:07:19 +08:00 via iPhone
    弄成汇编都一样
    r0ck3r
        131
    r0ck3r  
       2018-04-20 12:08:35 +08:00
    优秀的代码没有代码
    wibile
        132
    wibile  
       2018-04-20 12:10:01 +08:00
    优秀的人不写代码!
    eloah
        133
    eloah  
       2018-04-20 12:11:33 +08:00
    不,是没有性生活的
    aliao0019
        134
    aliao0019  
       2018-04-20 12:37:26 +08:00
    @Chingim 求知这个生成截图的工具是什么
    Chingim
        135
    Chingim  
       2018-04-20 12:46:54 +08:00
    secretman
        136
    secretman  
       2018-04-20 12:51:33 +08:00 via iPhone
    @wellsc 因为懒得处理,直接 throthrow 了
    wizardoz
        137
    wizardoz  
       2018-04-20 12:59:07 +08:00
    代码可以 if else,但是思维模式不能用 if else
    就好比修改个功能,认为只要在某个地方加个 if else 就可以解决问题的,多半是坑。
    wizardoz
        138
    wizardoz  
       2018-04-20 13:00:30 +08:00
    @aliao0019 他这个就是 macOS 的系统截图 Command+shift+4 然后按空格键,就是窗口截图
    solobat
        139
    solobat  
       2018-04-20 13:03:47 +08:00
    以前公司培训说不写 else,后面写多了发现,写上 else 最放心了。
    ryd994
        140
    ryd994  
       2018-04-20 13:15:59 +08:00
    其实编译器会优化成一样的
    第一种写法主要用于有大量错误检查的情况,可以 fail fast
    避免代码嵌套过多
    ty89
        141
    ty89  
       2018-04-20 13:17:56 +08:00
    优秀的代码没有代码
    armstrong
        142
    armstrong  
       2018-04-20 14:11:43 +08:00
    部分认同,在 Java 里面,如果业务逻辑复杂,出现大量的 if else 的话,可以考虑设计模式,用一些封装、多态来解决。if else 不是问题,如果代码里只有大量的 if else,没有任何抽象、封装,那就是问题
    DRcoding
        143
    DRcoding  
       2018-04-20 14:24:49 +08:00
    据说优秀的程序员都没有头发?

    据说 Mac 是程序员的标配?

    据说 PHP 是世界上最好的语言?

    ......
    spark
        144
    spark  
       2018-04-20 14:25:36 +08:00 via iPhone
    优秀的程序员不写代码,全部外包出去
    SummerWQM
        145
    SummerWQM  
       2018-04-20 15:00:16 +08:00
    这个说法 我是赞成的 我也是这么写 但是经验大佬给我说 加 else 方便扩展
    X41822N
        146
    X41822N  
       2018-04-20 16:35:13 +08:00
    优秀的代码确实没有 else

    https://github.com/kelseyhightower/nocode
    changwei
        147
    changwei  
       2018-04-20 21:07:11 +08:00
    优秀的代码只有 goto
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1056 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:04 · PVG 07:04 · LAX 16:04 · JFK 19:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.