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

不要 if else 的编程

  •  
  •   barb · 2013-11-27 09:25:32 +08:00 · 6576 次点击
    这是一个创建于 4014 天前的主题,其中的信息可能已经有所发展或是发生改变。
    31 条回复    1970-01-01 08:00:00 +08:00
    vibbow
        1
    vibbow  
       2013-11-27 09:39:48 +08:00
    不用if else,难道用switch?
    GTim
        2
    GTim  
       2013-11-27 09:43:06 +08:00
    每个语言都不同,不能一概而论
    chchwy
        3
    chchwy  
       2013-11-27 09:43:58 +08:00   ❤️ 1
    很多 Design Pattern 的手法就是把 if-else 換成多態。
    proudduck
        4
    proudduck  
       2013-11-27 09:49:04 +08:00
    我都干过把 if-else 换成反射来着。。。
    vietor
        5
    vietor  
       2013-11-27 10:00:39 +08:00
    if-else的性能还是非常好的,那些提到的替代算法:仅仅是为了浪费CPU而做的轮子。同时,那些算法的可读性,其实并不像他们想象的那样有提高,我认为是“下降”了。
    hitsmaxft
        6
    hitsmaxft  
       2013-11-27 10:15:24 +08:00   ❤️ 1
    if else 简洁高效

    但是很方便写上N层, 不用考虑梳理业务, 导致代码无法维护, 这才是被诟病的原因. 说到底是程序员自己的问题. 代价太低, 啥水平的人都能上来添乱

    把所有程序员偷懒的路子都堵上, 不见得是好事.
    Golevka
        7
    Golevka  
       2013-11-27 10:27:47 +08:00   ❤️ 1
    奥卡姆剃刀
    chmlai
        8
    chmlai  
       2013-11-27 10:44:23 +08:00
    就知道他要说用多态或者表带替代switch和if/else.
    Mutoo
        9
    Mutoo  
       2013-11-27 11:15:47 +08:00   ❤️ 2
    多态,NullObject 都是消除 if-else 的方法,可以让结构看起来清晰一些。

    在《程序员的数学》里面有个例子,有个人要吃一个月的药,规则是单日吃,双日不吃,但是他经常记不起来今天是单日还是双日,所以它就弄了30个药丸,其中15个有药剂,15个空的,间隔排开,然后每天都吃一个,这样它就不用管(if-else)今天是单日还是双日了。
    zhujinliang
        10
    zhujinliang  
       2013-11-27 11:25:34 +08:00   ❤️ 1
    恩,有些地方确实一点也没用if-else,真的,都是JC,JNC,CJNE,DJNZ。。。
    lanyueniao
        11
    lanyueniao  
       2013-11-27 11:30:29 +08:00
    有分支就有if
    else的地方都能用return
    halfelf
        12
    halfelf  
       2013-11-27 11:38:31 +08:00
    里面的例子完全不适用,他那个能拆开是因为代码本身就该将take和padding解耦
    dreampuf
        13
    dreampuf  
       2013-11-27 11:53:19 +08:00
    @Mutoo 再加一个table drive
    enson110
        14
    enson110  
       2013-11-27 12:13:22 +08:00   ❤️ 1
    设计模式是毒药,已经毒到每写一个函数都考虑要不要建一个类。
    后来我领悟了,第一次写代码,除非认定到后期一定会变化,否则直接写,等到以后变的时候再搞。
    实现功能是主要,if else 就算你用拼音命名也不是不可以,只要你身边都能看懂,一切都ok。
    hit9
        15
    hit9  
       2013-11-27 12:44:22 +08:00   ❤️ 1
    为什么不用、 if else 描述分支再好不过了
    FrankFang128
        16
    FrankFang128  
       2013-11-27 12:47:57 +08:00
    《不要过度设计》
    wtbhk
        17
    wtbhk  
       2013-11-27 12:50:05 +08:00
    凡事一概而论多半完蛋
    Lelouchcr
        18
    Lelouchcr  
       2013-11-27 14:11:13 +08:00
    为了这,还不如去写函数式。
    yuxing1171
        19
    yuxing1171  
       2013-11-27 14:28:29 +08:00
    避免不了, 但可以尽量少用。
    msg7086
        20
    msg7086  
       2013-11-27 17:08:16 +08:00
    看到标题第一反应是楼主要介绍haskell了么
    rail4you
        21
    rail4you  
       2013-11-27 17:27:54 +08:00
    准确的说法应该是不要滥用if else编程,

    if else的层次越多,越接近goto语句,可读性越差。复杂的if else可以重构改善可读性。文章里的例子不算好,简单的if else对程序员来说是很容易读懂,没必要折腾。
    josephshen
        22
    josephshen  
       2013-11-27 20:15:32 +08:00
    呵呵。。。
    est
        23
    est  
       2013-11-27 20:48:57 +08:00
    这个装逼不算。有本事写汇编不要用CMP
    Golevka
        24
    Golevka  
       2013-11-28 00:41:18 +08:00
    其实你们可以用这种方式代替branching:
    ([lambda_t, lambda_f][to_int (not cond_expr)])();

    其中lambda_t是true分支,当cond_expr求值为true时,to_int(not true)为0所以调用lambda_t;反之调用lambda_f。当然原文的本意也不是鼓励我们这么矫枉过正地回避branching。
    davepkxxx
        25
    davepkxxx  
       2013-11-28 11:07:57 +08:00 via Android
    用语言特性和设计模式代替条件选择么?
    mikawudi
        26
    mikawudi  
       2013-11-28 13:41:58 +08:00
    @Golevka 就是表驱动么?一个函指针数组,具体取下标由执行一个判断函数来确定,但是很多强类型语言里面要求列表中放置同类型数据,所以要lambda_t,lambda_f有相同的函数签名(例如csharp
    int a = 0;
    Func<int> getIndex = ()=>{return 1;};
    new List<Action> { () => { a = 10; }, () => { a = 20; } }[getIndex()]();)
    .....就算可以再外面包上一层相同原型的函数....效率不是更低了么毕竟多了几次call呢.....而且这样表驱动的话.....本身就是找列表地址然后call.....对比cmp,然后ja|jb|je来的要慢吧?
    luikore
        27
    luikore  
       2013-11-28 14:52:54 +08:00
    @est 很简单啊, CMP 换成 SUB
    nil
        28
    nil  
       2013-11-28 15:33:59 +08:00
    就作者给出的例子来看,非常靠谱;文档title翻译略显蛋疼。。。
    Golevka
        29
    Golevka  
       2013-11-28 20:58:56 +08:00   ❤️ 1
    @mikawudi 认真了你就输了=w=
    lzt163
        30
    lzt163  
       2013-11-29 10:42:23 +08:00
    = =隐约记得重构那本书就说要用多态来着。。。
    有点烦
    mikawudi
        31
    mikawudi  
       2013-11-30 11:09:07 +08:00
    @Golevka = -!你妹.....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1498 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:22 · PVG 01:22 · LAX 09:22 · JFK 12:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.