• 请不要在回答技术问题时复制粘贴 AI 生成的内容
GoPHP
V2EX  ›  程序员

据说优秀的代码没有 else?

  •  1
     
  •   GoPHP · Apr 18, 2018 · 18885 views
    This topic created in 2980 days ago, the information mentioned may be changed or developed.

    多个 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 replies    2018-04-20 21:07:11 +08:00
    1  2  
    natscat
        101
    natscat  
       Apr 19, 2018   ❤️ 1
    我觉得程序里面应该把每一种可能的执行路径都写清楚
    所以我是支持 if...else...这种的
    lightening
        102
    lightening  
       Apr 19, 2018   ❤️ 1
    看情况。如果 if 是作为过滤掉一些非正常情况,那么早早 return 掉是可以接受。如果本来就是两种需要正常处理的情况,当然是 if ... else 更清晰。
    floyda
        103
    floyda  
       Apr 19, 2018
    优秀的代码没有 if 的
    afpro
        104
    afpro  
       Apr 19, 2018
    优秀的代码不拘泥于有没有 if 这种细节 整体的可读性更重要
    dayoushen
        105
    dayoushen  
       Apr 19, 2018   ❤️ 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  
       Apr 19, 2018
    else 可以有,但是多层嵌套不应该
    awing
        107
    awing  
       Apr 19, 2018   ❤️ 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  
       Apr 19, 2018
    @awing #107 为什么不用 switch case
    guog
        109
    guog  
       Apr 19, 2018 via Android
    @MasterC Python🌚
    hansight2018
        110
    hansight2018  
       Apr 19, 2018 via Android
    refer to "guard clause"
    bobuick
        111
    bobuick  
       Apr 19, 2018
    什么鬼。
    反了吧,优秀的代码应该要有 else, 如果没 else 说明这个 if 可以再抽象到一个函数里去。 如果是简单的 if, 应该是存在三元表达式的方式表达。
    MeteorCat
        112
    MeteorCat  
       Apr 19, 2018
    涉及业务多的时候,你就知道了
    undefined8
        113
    undefined8  
       Apr 19, 2018
    优秀程序员 tab 是 8 个空格
    yanyuechuixue
        114
    yanyuechuixue  
       Apr 19, 2018
    认同一部分吧, 如果是发生了某条件需要做一件事, 而不发生的时候不需要做, 那么最好不用 else 只用 if, 提升效率. 而且最好 if 的条件为真的概率要更大.

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


    求比较, 求更优雅的方案
    akira
        116
    akira  
       Apr 20, 2018
    @Chingim 根据与或关系应该是可以获得 0-3,4 个数字
    Chingim
        117
    Chingim  
       Apr 20, 2018 via Android
    @akira show your code
    elvodn
        118
    elvodn  
       Apr 20, 2018
    @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")
    }
    }
    ```
    v2gba
        119
    v2gba  
       Apr 20, 2018   ❤️ 1
    优秀的代码没有 if
    优秀的代码只有优秀的客户才配用 只有一种可能 没有任何 if 没有任何异常 如果发生了 那么就是客户不够优秀
    akira
        120
    akira  
       Apr 20, 2018
    @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  
       Apr 20, 2018
    @elvodn 没看过 go,好奇的问下,若 isSunny, isHappy 都为真,那么这个 switch 的前 3 个表达式的值都是真。这种情况下 switch 是怎么区分的呢
    elvodn
        122
    elvodn  
       Apr 20, 2018
    @akira go 里 switch 是默认 break 的
    goinghugh
        123
    goinghugh  
       Apr 20, 2018
    @awing python 可以用字典的方式实现 switch case
    zhouquan03
        124
    zhouquan03  
       Apr 20, 2018
    强烈反对写 if 不写 else
    LZ 多写代码就会发现漏了 else 逻辑多么可怕
    EanCuznaivy
        125
    EanCuznaivy  
       Apr 20, 2018
    有些 IDE 会提示你有不必要的 else ……
    loveour
        126
    loveour  
       Apr 20, 2018
    @zhouquan03
    赞同。不明白非得不要 else 意义何在。。
    pmispig
        127
    pmispig  
       Apr 20, 2018
    优秀的代码必须有 else,证明你有考虑到这种情况。
    hatcloud
        128
    hatcloud  
       Apr 20, 2018
    @loveour
    其实不是反对 else 而是 else 带来的嵌套问题,就一层的话我觉得没什么问题。
    我的理解是多层 if-else 很容易使代码呈现树状结构,很不易于他人阅读,而事实上大部分情况下,多层嵌套的 if-else 都可以通过 if-return 来替换成比较线性的代码。
    @Chingim #115 的例子就很好
    satanandroid
        129
    satanandroid  
       Apr 20, 2018
    可读性好 逻辑清晰 就是优秀的代码。
    和什么 else 不 else 一点关系都没
    lloovve
        130
    lloovve  
       Apr 20, 2018 via iPhone
    弄成汇编都一样
    r0ck3r
        131
    r0ck3r  
       Apr 20, 2018
    优秀的代码没有代码
    wibile
        132
    wibile  
       Apr 20, 2018
    优秀的人不写代码!
    eloah
        133
    eloah  
       Apr 20, 2018
    不,是没有性生活的
    v4dc
        134
    v4dc  
       Apr 20, 2018
    @Chingim 求知这个生成截图的工具是什么
    Chingim
        135
    Chingim  
       Apr 20, 2018
    secretman
        136
    secretman  
       Apr 20, 2018 via iPhone
    @wellsc 因为懒得处理,直接 throthrow 了
    wizardoz
        137
    wizardoz  
       Apr 20, 2018
    代码可以 if else,但是思维模式不能用 if else
    就好比修改个功能,认为只要在某个地方加个 if else 就可以解决问题的,多半是坑。
    wizardoz
        138
    wizardoz  
       Apr 20, 2018
    @aliao0019 他这个就是 macOS 的系统截图 Command+shift+4 然后按空格键,就是窗口截图
    solobat
        139
    solobat  
       Apr 20, 2018
    以前公司培训说不写 else,后面写多了发现,写上 else 最放心了。
    ryd994
        140
    ryd994  
       Apr 20, 2018
    其实编译器会优化成一样的
    第一种写法主要用于有大量错误检查的情况,可以 fail fast
    避免代码嵌套过多
    ty89
        141
    ty89  
       Apr 20, 2018
    优秀的代码没有代码
    armstrong
        142
    armstrong  
       Apr 20, 2018
    部分认同,在 Java 里面,如果业务逻辑复杂,出现大量的 if else 的话,可以考虑设计模式,用一些封装、多态来解决。if else 不是问题,如果代码里只有大量的 if else,没有任何抽象、封装,那就是问题
    DRcoding
        143
    DRcoding  
       Apr 20, 2018
    据说优秀的程序员都没有头发?

    据说 Mac 是程序员的标配?

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

    ......
    spark
        144
    spark  
       Apr 20, 2018 via iPhone
    优秀的程序员不写代码,全部外包出去
    SummerWQM
        145
    SummerWQM  
       Apr 20, 2018
    这个说法 我是赞成的 我也是这么写 但是经验大佬给我说 加 else 方便扩展
    X41822N
        146
    X41822N  
       Apr 20, 2018
    优秀的代码确实没有 else

    https://github.com/kelseyhightower/nocode
    changwei
        147
    changwei  
       Apr 20, 2018
    优秀的代码只有 goto
    1  2  
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1058 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 105ms · UTC 22:49 · PVG 06:49 · LAX 15:49 · JFK 18:49
    ♥ Do have faith in what you're doing.