V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
barb
V2EX  ›  程序员

不要 if else 的编程

  •  
  •   barb · Nov 27, 2013 · 7331 views
    This topic created in 4545 days ago, the information mentioned may be changed or developed.
    31 replies    1970-01-01 08:00:00 +08:00
    vibbow
        1
    vibbow  
       Nov 27, 2013
    不用if else,难道用switch?
    yemoluo
        2
    yemoluo  
       Nov 27, 2013
    每个语言都不同,不能一概而论
    chchwy
        3
    chchwy  
       Nov 27, 2013   ❤️ 1
    很多 Design Pattern 的手法就是把 if-else 換成多態。
    proudduck
        4
    proudduck  
       Nov 27, 2013
    我都干过把 if-else 换成反射来着。。。
    vietor
        5
    vietor  
       Nov 27, 2013
    if-else的性能还是非常好的,那些提到的替代算法:仅仅是为了浪费CPU而做的轮子。同时,那些算法的可读性,其实并不像他们想象的那样有提高,我认为是“下降”了。
    hitsmaxft
        6
    hitsmaxft  
       Nov 27, 2013   ❤️ 1
    if else 简洁高效

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

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

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

    if else的层次越多,越接近goto语句,可读性越差。复杂的if else可以重构改善可读性。文章里的例子不算好,简单的if else对程序员来说是很容易读懂,没必要折腾。
    josephshen
        22
    josephshen  
       Nov 27, 2013
    呵呵。。。
    est
        23
    est  
       Nov 27, 2013
    这个装逼不算。有本事写汇编不要用CMP
    Golevka
        24
    Golevka  
       Nov 28, 2013
    其实你们可以用这种方式代替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  
       Nov 28, 2013 via Android
    用语言特性和设计模式代替条件选择么?
    mikawudi
        26
    mikawudi  
       Nov 28, 2013
    @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  
       Nov 28, 2013
    @est 很简单啊, CMP 换成 SUB
    nil
        28
    nil  
       Nov 28, 2013
    就作者给出的例子来看,非常靠谱;文档title翻译略显蛋疼。。。
    Golevka
        29
    Golevka  
       Nov 28, 2013   ❤️ 1
    @mikawudi 认真了你就输了=w=
    lzt163
        30
    lzt163  
       Nov 29, 2013
    = =隐约记得重构那本书就说要用多态来着。。。
    有点烦
    mikawudi
        31
    mikawudi  
       Nov 30, 2013
    @Golevka = -!你妹.....
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2964 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 152ms · UTC 15:27 · PVG 23:27 · LAX 08:27 · JFK 11:27
    ♥ Do have faith in what you're doing.