打印
[C语言]

面对对象滚蛋篇--谈程序通用【转】

[复制链接]
1763|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlsbz|  楼主 | 2014-10-30 13:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
谈程序的“通用性”

(王垠 yinwang.org 版权所有,未经许可,请勿转载)

在现实的软件工程中,我经常发现这样的一种现象。本来用很简单的代码就可以解决的问题,却因为设计者过分的关注了“通用性”,“可维护性”和“可扩展性”,被搞得绕了几道弯,让人琢磨不透。

这些人的思维方式是这样的:“将来这段代码可能会被用到更多的场合,所以我现在就考虑到扩展问题。”于是乎,他们在代码中加入了各种各样的“框架结构”,目的是为了在将来有新的需要的时候,代码能够“不加修改”就被用到新的地方。

我并不否认“通用性”的价值,实际上我的某些程序通用性非常之强。可是很多人所谓的“通用性”,其实达到的是适得其反的效果。这种现象通常被称为“过度工程” (over-engineer)。关于过度工程,有一个有趣的故事:

http://www.snopes.com/business/genius/spacepen.asp

传说 1960 年代美俄“太空竞赛”的时候,NASA 遇到一个严重的技术问题:宇航员需要一支可以在外太空的真空中写字的钢笔。最后 NASA 耗资150万美元研制出了这样的钢笔。可惜这种钢笔在市场上并不行销。

俄国人也遇到同样的问题。他们使用了铅笔。

这个故事虽然是假的,但是却具有伊索寓言的威力。现在再来看我们的软件行业,你也许会发现:

代码需要被“重用”的场合,实际上比你想象的要少

我发现很多人写程序的时候连“眼前特例”都没做好,就在开始“展望将来”。他们总是设想别人会重用这段代码。而实际上,由于他们的设计过于复杂,理解这设计所需的脑力开销已经高于从头开始的代价,所以大部分人其实根本不会去用他们的代码,自己重新写一个就是了。也有人到后来发现,之前写的那段代码,连自己都看不下去了,恨不得删了重来,就不要谈什么重用了。

修改代码所需要的工作实际上比你想象的要少

还有一种情况是,这些被设计来“共享”的代码,其实根本没有被用在很多的地方,所以即使你完全手动的修改它们也花不了很多时间。现在再加上 IDE 技术的发展和各种先进的 refactor 工具,批量的修改代码已经不是特别麻烦的事情。曾经需要在逻辑层面上进行的可维护性设计,现在有可能只需要在 IDE 里面点几下鼠标就轻松完成。所以在考虑设计一个框架之前,你应该同时考虑到这些因素。

“考虑”到了通用性,并不等于你就准确地“把握”住了通用性

很多人考虑到了通用性,却没有准确的看到,到底是哪一个部分将来可能需要修改,所以他们的设计经常抓不住关键。当有新的需要出现的时候,才发现原来设想的可能变化的部分,其实根本没有变,而原来以为不会变的地方却变了。

能够准确的预测将来的需要,能够从代码中抽象出真正通用的框架,是一件非常困难的事情。它不止需要有编程的能力,而且需要对真实世界里的事物有强大的观察能力。很多人设计出来的框架,其实只是照搬别人的经验,却不能适应实际的需要。在 Java 世界里的很多 design pattern,就是这些一知半解的人设计出来的。

初期设计的复杂性

如果在第一次的设计中就过早的考虑到将来,由此带来的多余的复杂性,有可能让初期的设计就出现问题。所以这种对于将来的变化的考虑,实际上帮了倒忙。本来如果专注于解决现在的问题,能够得到非常好的结果。但是由于“通用性”带来的复杂度,设计者的头脑每次都要多转几道弯,所以它无法设计出优雅的程序。

理解和维护框架性代码的开销

如果你设计了框架性的代码,每个程序员为了在这个框架下编写代码,都需要理解这种框架的构造,这带来了学习的开销。一旦发现这框架有设计问题,依赖于它的代码很有可能需要修改,这又带来了修改的开销。所以加入“通用性”之后,其实带来了更多的工作。这种开销能不能得到回报,依赖于以上的多种因素。

所以在设计程序的时候,我们最好是先把手上的问题解决好。如果发现这段代码还可以被用在很多别的地方,到时候再把框架从中抽象出来也不迟。

相关帖子

沙发
xlsbz|  楼主 | 2014-10-31 07:48 | 只看该作者
这么好的帖子没人顶。
晕了。
怪不得compter00 之类的大侠都不来这个论坛了。
以后我也考虑考虑

使用特权

评论回复
板凳
zwm2011| | 2014-10-31 08:12 | 只看该作者
别灰心,好东西一定会被发现。但是仅仅谈点概念性的东西,看的人肯定会不多,有能力的人忙着做项目,除非十分对口,否则不会去看,没有能力的人,看了也白看,所以你的这些东西,就剩下那些,能力不足,但是有渴望得到知识的看了;

使用特权

评论回复
地板
zhimagod| | 2014-10-31 08:18 | 只看该作者
呃……理解了大概的意思是:有能力的话怎么弄都成,如果没那能力还是先解决眼前的问题比较好

使用特权

评论回复
5
link8001| | 2014-10-31 10:39 | 只看该作者
好贴要顶

使用特权

评论回复
6
shdjdq| | 2014-10-31 15:37 | 只看该作者
有一定的道理,不过人的行径不是直线的。

使用特权

评论回复
7
萧十一郎hot| | 2014-10-31 20:21 | 只看该作者
好东西

使用特权

评论回复
8
天凉好个秋| | 2014-11-1 08:43 | 只看该作者
人类的认知是螺旋式前进,所以文中的观点,也对,也不对

使用特权

评论回复
9
疯子8972| | 2014-11-1 11:46 | 只看该作者
理想与现实的差距
通用性是需要进化来实现的
灵长类的动物也不是一天两天就出现了
如果说通用性不足,只能说进化的时间不够
代码就是需要不停重构,不停重构,程序员就是帮助程序进化的神
除非等到代码本身能自己重构并优化自己的那一天
程序员就应该不停去优化已有的代码
并用基于已有的代码去处理更新的问题

如果你这个神无法帮助你的程序成为一个强大的“灵长类”
那好吧   先设计个细菌吧

使用特权

评论回复
评论
john_lee 2014-11-1 11:55 回复TA
飞船兄好久不见了,见解深刻啊 
10
xlsbz|  楼主 | 2014-11-6 15:23 | 只看该作者
疯子8972 发表于 2014-11-1 11:46
理想与现实的差距
通用性是需要进化来实现的
灵长类的动物也不是一天两天就出现了

宇宙飞船????真的是你?

使用特权

评论回复
11
zllfdd| | 2014-11-7 17:08 | 只看该作者
写的不错

使用特权

评论回复
12
wsnsyy| | 2014-11-7 17:49 | 只看该作者
多想想總還是好的

使用特权

评论回复
13
xlsbz|  楼主 | 2014-11-7 21:25 | 只看该作者
wsnsyy 发表于 2014-11-7 17:49
多想想總還是好的

不想,只回复也行

使用特权

评论回复
14
liguohx| | 2014-11-10 17:49 | 只看该作者
差点走弯路,还是做好眼前的事吧

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

190

主题

1614

帖子

4

粉丝