
1 vibbow 2013-11-27 09:39:48 +08:00 不用if else,难道用switch? |
2 yemoluo 2013-11-27 09:43:06 +08:00 每个语言都不同,不能一概而论 |
3 chchwy 2013-11-27 09:43:58 +08:00 很多 Design Pattern 的手法就是把 if-else 成多。 |
4 proudduck 2013-11-27 09:49:04 +08:00 我都干过把 if-else 换成反射来着。。。 |
5 vietor 2013-11-27 10:00:39 +08:00 if-else的性能还是非常好的,那些提到的替代算法:仅仅是为了浪费CPU而做的轮子。同时,那些算法的可读性,其实并不像他们想象的那样有提高,我认为是“下降”了。 |
6 hitsmaxft 2013-11-27 10:15:24 +08:00 if else 简洁高效 但是很方便写上N层, 不用考虑梳理业务, 导致代码无法维护, 这才是被诟病的原因. 说到底是程序员自己的问题. 代价太低, 啥水平的人都能上来添乱 把所有程序员偷懒的路子都堵上, 不见得是好事. |
7 Golevka 2013-11-27 10:27:47 +08:00 奥卡姆剃刀 |
8 chmlai 2013-11-27 10:44:23 +08:00 就知道他要说用多态或者表带替代switch和if/else. |
9 Mutoo 2013-11-27 11:15:47 +08:00 多态,NullObject 都是消除 if-else 的方法,可以让结构看起来清晰一些。 在《程序员的数学》里面有个例子,有个人要吃一个月的药,规则是单日吃,双日不吃,但是他经常记不起来今天是单日还是双日,所以它就弄了30个药丸,其中15个有药剂,15个空的,间隔排开,然后每天都吃一个,这样它就不用管(if-else)今天是单日还是双日了。 |
10 zhujinliang 2013-11-27 11:25:34 +08:00 恩,有些地方确实一点也没用if-else,真的,都是JC,JNC,CJNE,DJNZ。。。 |
11 lanyueniao 2013-11-27 11:30:29 +08:00 有分支就有if else的地方都能用return |
12 halfelf 2013-11-27 11:38:31 +08:00 里面的例子完全不适用,他那个能拆开是因为代码本身就该将take和padding解耦 |
14 ensonfun 2013-11-27 12:13:22 +08:00 设计模式是毒药,已经毒到每写一个函数都考虑要不要建一个类。 后来我领悟了,第一次写代码,除非认定到后期一定会变化,否则直接写,等到以后变的时候再搞。 实现功能是主要,if else 就算你用拼音命名也不是不可以,只要你身边都能看懂,一切都ok。 |
15 hit9 2013-11-27 12:44:22 +08:00 为什么不用、 if else 描述分支再好不过了 |
16 FrankFang128 2013-11-27 12:47:57 +08:00 《不要过度设计》 |
17 wtbhk 2013-11-27 12:50:05 +08:00 凡事一概而论多半完蛋 |
18 Lelouchcr 2013-11-27 14:11:13 +08:00 为了这,还不如去写函数式。 |
19 yuxing1171 2013-11-27 14:28:29 +08:00 避免不了, 但可以尽量少用。 |
20 msg7086 2013-11-27 17:08:16 +08:00 看到标题第一反应是楼主要介绍haskell了么 |
21 rail4you 2013-11-27 17:27:54 +08:00 准确的说法应该是不要滥用if else编程, if else的层次越多,越接近goto语句,可读性越差。复杂的if else可以重构改善可读性。文章里的例子不算好,简单的if else对程序员来说是很容易读懂,没必要折腾。 |
22 josephshen 2013-11-27 20:15:32 +08:00 呵呵。。。 |
23 est 2013-11-27 20:48:57 +08:00 这个装逼不算。有本事写汇编不要用CMP |
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。 |
25 davepkxxx 2013-11-28 11:07:57 +08:00 via Android 用语言特性和设计模式代替条件选择么? |
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来的要慢吧? |
28 nil 2013-11-28 15:33:59 +08:00 就作者给出的例子来看,非常靠谱;文档title翻译略显蛋疼。。。 |
30 lzt163 2013-11-29 10:42:23 +08:00 = =隐约记得重构那本书就说要用多态来着。。。 有点烦 |