不要 if else 的编程

2013-11-27 09:25:32 +08:00
 barb
http://www.linuxeden.com/html/news/20131127/145900.html
高手们怎么看?
6576 次点击
所在节点    程序员
31 条回复
rail4you
2013-11-27 17:27:54 +08:00
准确的说法应该是不要滥用if else编程,

if else的层次越多,越接近goto语句,可读性越差。复杂的if else可以重构改善可读性。文章里的例子不算好,简单的if else对程序员来说是很容易读懂,没必要折腾。
josephshen
2013-11-27 20:15:32 +08:00
呵呵。。。
est
2013-11-27 20:48:57 +08:00
这个装逼不算。有本事写汇编不要用CMP
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
2013-11-28 11:07:57 +08:00
用语言特性和设计模式代替条件选择么?
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
2013-11-28 14:52:54 +08:00
@est 很简单啊, CMP 换成 SUB
nil
2013-11-28 15:33:59 +08:00
就作者给出的例子来看,非常靠谱;文档title翻译略显蛋疼。。。
Golevka
2013-11-28 20:58:56 +08:00
@mikawudi 认真了你就输了=w=
lzt163
2013-11-29 10:42:23 +08:00
= =隐约记得重构那本书就说要用多态来着。。。
有点烦
mikawudi
2013-11-30 11:09:07 +08:00
@Golevka = -!你妹.....

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/90780

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX