如何正确的对待设计模式

自从接触设计模式以来,一般看到的评论是以推崇为多。不过比较欣慰的是,最近在看《编程人生》中,有两个人对设计模式比较不屑。 
之所以欣慰,并不是因为凑个热闹看他们互相攻击,互相批评——而是因为出现了不同的观点,特别是两位非常有分量的人物的观点。在技术领域,众口一词是一件非常恐怖的事情;百花齐放百家争鸣才是我们乐于看到的。因为不同观点的出现,特别是大师级的不同观点,能够促进更多的人去独立的思考与探索 。


好了,回归主题。编程人生中,《编程人生》中至少有两个人谈到了设计模式。 
jamie zawinski:著名的lisp黑客,Netscape浏览器和Mozilla浏览器的核心开发者。在谈到程序员要读的书时说: 
“还有一本书叫《设计模式》,人人追捧,奉为圭臬。不过,在我看来,这本书一派胡言,给人的感觉好像是编程只需要剪贴粘贴就能搞定。你不用全盘考虑要做的任务,只要看看这本配方书,找个有几分相近的模式,直接套用就行了。那根本不是编程,那是在涂色书。不过,似乎很多人都对这本书着了魔。” 
Brendan eich,JavaScript之父,Mozilla公司CTO,在提到为编程想做而没有做的事情时说: 
“我并不是一个热衷于面向对象和设计模式的人。从来没有买过Gamma的书(《设计模式》)。网景公司有些人买,Jamie zawinski的人或者网景收购的公司来的那些冤家对头会买,他们把这本书当圣经一样显摆,真有点让人受不了,他们根本就不是最好的程序员。”

 

至于什么是设计模式,他有什么好处等等,不是我今天要说。我想举个例子,做个对比。我们都知道,设计模式源于建筑领域,建筑领域可能离我们太远,我今天想拿篮球运动做个对比。

篮球运动员为了提高篮球水平,除了进行身体训练和投篮训练外,还会进行一些连贯动作的训练和一些战术配合训练。比如,像交叉步,急停跳投,转身过人,挡拆等等。这些训练是从何而来?篮球运动刚刚诞生的时候肯定没有。而是运动员在篮球运动过程中,发现在某一种情况下(也就是防守队员和团队成员的位置),使用某一中类似的连贯动作往往能够取到非常好的效果。所以就有悟性非常高的人把这种约束条件和要采取的动作都总结出来,让运动员在训练中反复的训练,以形成一种条件反射,在出现合适的机会的时候,快速而有效的使用这些连贯动作。

我想这也是模式的起源。有一点不同的是,我们学习设计模式的过程,是一种思维训练的过程 。

不难想象,如果没有这些东西,运动员要提高篮球水平有多困难。但运动员如果在比赛中滥用,花哨的动作也许会增强比赛的观赏性,但是它却偏离了篮球运动的本质:将篮球投进并赢得比赛。

 

其实,上面的这些分析对于武术也同样适用。武侠迷可能会记得金庸笔下纷繁复杂招式名称(其实也是模式)。不过,金庸倒也提到过更高的境界:“无招胜有招 ”。印象当中张无忌学习太极拳和令狐冲学习独孤九剑有描述。他们在学成之后确实很厉害。难怪jamie zawinski和Brendan eich会有些反对模式,也许他们已经学到了无招胜有招的真谛,也许他们是黑客,不喜欢思维受到限制。

难道我们要抛弃所有的模式?不过我认为它可能并不适合所有的人,它依赖于人的造诣,以及天赋,悟性。我们很多人要获得提高,进行一些模式训练,也许还是一条非常有效的途径。

乱七八糟说了这么多,最后总结一下:

  1. 首先要认识到它的本质,模式是前人知识经验的总结,不是现成的解决方案,所以不要硬套。
  2. 对于初学者来说,模式是个好东西,学习一些模式是一条有效的提高途径。
  3. 不要过度使用设计模式,他会给你带来额外的复杂度。 在我的眼中,简单性才是一个技术方案的首要因素。你知不知道李小龙截拳道的核心是什么?抛开招式,直截了当的进行最有效的攻击和防守。
  4. 不要把它当成银弹或者圣杯。
  5. 当你有一定的积累后,你也可以尝试“无招胜有招”的境界。

PS:我看过的一个比较奇特的观点,值得思考:

《黑客与画家》的作者在书中提到过,说有人做过研究,lisp语言自带可以支持GOF(四人帮)总结的16中模式。所以,如果你在编程时需要用到模式,那可能是你的语言不够强大,模式应该是语言支持的东西。(这段话是我根据印象写的,没有找到原话,所以可能有些出入。)

posted on 2011-09-17 01:24  四-儿  阅读(109)  评论(0编辑  收藏  举报

导航