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

据说优秀的代码没有 else?

  •  1
     
  •   GoPHP · 181 天前 · 11958 次点击
    这是一个创建于 181 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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


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

    据说 Mac 是程序员的标配?

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

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

    https://github.com/kelseyhightower/nocode
        147
    changwei   179 天前
    优秀的代码只有 goto
    1  2  
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3324 人在线   最高记录 3762   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.1 · 21ms · UTC 05:46 · PVG 13:46 · LAX 22:46 · JFK 01:46
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1