不要 if else 的编程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
barb
V2EX    程序员

不要 if else 的编程

  •  
  •   barb 2013-11-27 09:25:32 08:00 7061 次点击
    这是一个创建于 4391 天前的主题,其中的信息可能已经有所发展或是发生改变。
    31 条回复    1970-01-01 08:00:00 +08:00
    vibbow
        1
    vibbow  
       2013-11-27 09:39:48 +08:00
    不用if else,难道用switch?
    yemoluo
        2
    yemoluo  
       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
    ensonfun
        14
    ensonfun  
       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     Solana     5244 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 06:37 PVG 14:37 LAX 22:37 JFK 01:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86