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

据说优秀的代码没有 else?

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

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


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

    据说 Mac 是程序员的标配?

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

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

    https://github.com/kelseyhightower/nocode
    changwei
    changwei
    Apr 20, 2018
    147
    优秀的代码只有 goto
    1  2  
    ❮ ❯
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   5036 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 82ms · UTC 00:14 · PVG 08:14 · LAX 16:14 · JFK 19:14
    ♥ Do have faith in what you're doing.