`

设计模式感悟(一)--- 程序员修炼上乘之道

阅读更多

         Christopher Alexander 是开创模式的鼻祖,有趣的是他研究的是建筑领域的体系结构,并非软件,其著作《A Pattern Language: Towns, Buildings, Construction》介绍了建造房屋和城市的通用模式。那么一本建筑学的著作为什么会对软件行业有这么大的影响力呢?我想这大概是文明相融相通的缘故吧。任何一项文明、一种文化都有其产生和发展的历程,该过程千奇百态,但又有本质上的相似,因为文明的发展是承前启后的,文化的内容是相互学习、相互包容的。计算机语言文明发展至今,最大限度的容纳了人类智慧的结晶,人类几乎离不开电子信息世界。同时由计算机语言而生的各种软件是计算机文明不可或缺的载体或工具。软件的发展如同华夏文化始祖人皇伏羲创建文明的过程,是启发、创造性思维相互作用的结果,那么软件又是受那些方面的因素启发而创造发展到现状的呢?很多很多方面,我想你已经猜到了其中一个 --- 建筑工程,是的,软件的发展从混沌状态到现在的大规模的规格化、系统化的生产,确实从建筑学借鉴了很多成功的经验,从而产生了软件工程、设计模式之类的先进思想。

     

         模式能给我们带来什么好处,或者说我们为什么要学习模式呢?其实我觉得模式就在我们的生活周围,只不过被Alexander用来定义某个方面的内容,该内容备受大家推崇,成了他的一家之言的“商标”了,请允许我这么打个比方^_^我们拿做饭来说吧,我们知道米饭应该先煮的差不多熟了,再捞起来用蒸笼蒸比较好吃(当然现代的电饭堡简化了该过程,不过做出来的饭没有“原始工艺”的香^_^); 韭菜和鸡蛋一起抄比较好吃;北京烤鸭难道不是养出来的鸭子烤的,谁都知道人家有自己的工艺配方,啥叫工艺配方,我个人理解为以下要素:火候、作料、制作流程。再拿茶水、酒水来说,不同的茶用不同水,不同的酒用不同的杯。这些都是人类生活总结的经验,这些和上述的模式有什么分别吗,我是不以为然的。我们不妨称这些为“生活模式”,Alexander 的为“建筑模式”。有了这些“模式”我们就能更高效、更有质量的保证生产。不是把菜洗干净丢进热锅里面抄就能作出可口的菜肴,有的人做出的饭菜味同嚼蜡,有的人做的饭菜即使普通材料也弄的如同珍馐佳肴让人留恋往返;不是把水烧来了就能泡出好茶来,什么水,怎么烧,怎么冲茶,都是很有讲究的,泡茶我没有机会亲身实践过,不过没见过猪跑还没吃过猪肉吗。^_^所以你应该乡下老家,请教你的爸爸妈妈、叔叔婶婶学学厨艺,有条件的你可以业余时间去参加厨师培训班,再不行,有钱你可以请个厨师,生活不要亏待自己;你应该跟领导多打交道,跟他请教、切磋一下茶道; 多出面一些交际场合,我想你不光会知道怎么喝酒这么简单。软件也一样,不是你一味一行一行的敲代码就能整出一套性能优良、运行稳定、客户满意的软件产品。软件发展已经经历过这样一种混乱的状态。想象一下计算机语言之初的状态,第一代骨灰级程序员是输0和1的组合来编制程序的(这是我很向往尝试的工作,可惜一直没有机会),输出是打孔的纸带,时间长了,他们发现一些有规律的东西(“计算机语言模式”雏形),汇编因此诞生了,依次类推,接下来是B, C C++和Java. 计算机语言好比是砖,软件好比是我们的建筑,如房子、街道、城市。物质资源日趋丰富,生活水平的不断提高,人类的房屋越来越坚固,越来越别致。不同的人群,不同的区域,不同的行业,对房屋的要求是不一样的,有适合平民的经济房,有适合有钱人的别墅,盖在地震多发地段的要防震(像日本的房子就是比较好的“建筑模式”),写字楼、卖厂和住宅楼是不应该盖一样的。这些都分门别类,各有方案模式;软件也是一样,有C/S结构,有B/S结构,有实时系统,有分布式系统他们各有特点。如果我们不懂模式,不运用模式,我想或许我们也能做出这些系统来,如果我给你一落砖,假以时间和毅力相信还是可以砌一座房子,如果不参考你以知的建筑模型和相关技术,你一定会历经重重失败才完成工作,或更本完成不了工作,你的房子即使造出来也是岌岌可危,这样的“危房”你敢住吗?建筑师就不同,他们学识渊博,经验丰富,他们知道门该开在那里合适,建拱门还是方形门,走廊应该建多长,这样主人才能住的舒服;对于地震地区的房子要防震,该采用什么结构和材料;卖厂和写字楼的房子该如何布局等等,都有现成的图纸和资料参考,这在他们心目中早已经胸有成竹了。熟能生巧,建筑师还可以在以有方案的基础上改革、创新。看看悉尼歌剧院,南京长江大桥,赵州桥,还有我们的鸟巢奥运会馆,相信你会感受到这些建筑模式是多么的巧夺天工。罗嗦了这么一大堆,其实我是想说,在软件行业是相似的,为什么我们有“软件工程”这个说词,就是软件行业向建筑行业借鉴产生的。软件工程定义了软件的生命周期(SDLC),软件设计模式定义了软件生产模式。在设计模式的指导下生产软件能更快速、更高质量、更方便的后期运行、维护……打个比方,你可以用50块砖盖出比别人用100砖盖的还坚固的围墙或其它物体。在软件开发中运用设计模式能用10个类完成未运用设计模式设计的上百上千个类的现象早已是明日黄花了。运用设计模式开发软件,开发人员之间更容易交流沟通,更容易把握项目的需求和发展状态。在《设计模式精解》中有这样的描述很恰当,说的是两个木匠正在讨论如何为橱柜制作抽屉的问题。 假设如果他们都不懂模式的情况下,下面是他们的对话:

             

             木匠1: 你认为我们应该怎样制作这些抽屉呢?

             木匠2: 唔,我想我们应该这样结合部分,在木材上直锯下去,然后回转45度锯,然后再直锯下去,再朝另一个方向回转45度,再直锯下去,然后……

 

      请问,如果你听明白他们究竟在说些什么吗,如果你能听懂,那只能说你跟他们太默契了,你们是天生的搭档、好哥们^_^

 

   

      让我们再来看看另一个场景,假设他们都懂模式的情况下,他们又是如何对话的呢:

 

              木匠1: 我们应该用一个燕尾结合还是一个斜面结合?

 

      现在木匠2说什么已经不重要的,问题已经放生了质的变化,现在很清楚了。如果你是个专业木匠我想你应该听的懂木匠1在说些什么。如果现在让你和我去做这个抽屉,我想我们是第一种情形的俩木匠,不过当我们“偷听”了第二种场景的木匠师傅的对话,我们心里似乎已经有了参考方案。现在GooGle,BaiDu真是太方便了,一查就知道燕尾结合和斜面结合是这么回事了。^_^

 

      不知道现在大家明白了设计模式的好处没有。设计模式是针对特定的场景下的特定问题的可重复、可表达的解决方案。上面两个木匠的场景就是要做橱柜抽屉,他们遇到的问题是怎么设计抽屉的结合,已经有两个久经考验的方案“燕尾结合”和“斜面结合”,只要做抽屉,你就应该想到这两种方案并能选择使用他们。

 

 

       既然设计模式这么好,我们该如何学习或者使用它呢?在讨论这个问题之前,让我们先充充电。

 

       Martin Fowler 在其《UML Distilled》一书中定义了软件开发过程的三个不同的视角,具体内容为:

       1。概念视角(conceptual view)     该视角展现了问题领域中的概念……一个概念模型可以在对实现软件有很少或毫无注意的情况下表达出来…… 这也就建议你,在这个层次讨论问题就把计算机语言给忘了吧(程序员做到这步确实需要功夫,但是客户好象天生比较容易做到^_^)。在面向对象的软件开发中,该层次定义了一系列的对象和他们的责任。

       2。规格视角(specification view)   该视角看软件,只看软件的接口,不看实现。请注意哦,这里的接口可不只是Java 语言里面的 Interface接口,关于这方面不清楚的要赶紧补课,不然学习模式会感觉懵懂。在面向对象的软件开发中,该层次定义了一系列可以被其他对象或本身调用的方法。

       3。实现视角(implementation view)  该视角置身代码本身。这可能是我们最常用的视角,但是在许多方面,规格视角是更好的视角。现在SSH能够盛行,与其在规格视角方面给广大用户考虑的很周到的因素不无有关。在面向对象的软件开发中,该层次就是一些代码和数据。

 

       另外设计模式的四大元老级人物“四人团”有以下三点建议:

       1。针对接口编程

       2。优先使用对象组合,而不是继承

       3。找到并封装变化点

 

 

       模式是经验、智慧的沉淀,具有抽象性,这样才能做通用,但是模式又是针对特定场景的。拿上述两个木匠的对话来打个比方吧,假设你是一个面向对象的开发者,要想学模式,我感觉可以从以下几个方面入手:

       1。要掌握模式表达的语言,这主要是针对书面的表达形式,面向对象的设计模式都是通过UML图来表达其模式含义的,如果你不懂得这些语言,好比是让你跟天上的鸟对话一样。还好,UML还是比较形象简洁的,简单熟悉他并不需要耗费你太多的精力。现在这方面的资料太多了。

       2。要掌握模式表达的场景,模式是针对特定场景下特定问题的,一旦你熟悉了模式的场景,当你置身这样的环境中你才能想到你已经有这样很成熟的参考方案。

       3。要掌握模式表达的方案,同一个场景可能有很多方案,具体选择哪个要根据你的具体需求来选择和配合

       4。要掌握模式表达的实现,一个既定模式的实现规格是已经确定的,只有已经熟悉了他你才能顺利进行你的工作,改进你的工作。

       5。要不断的实践,上述都是知识方面的准备,在实践上要多脑筋,平时要多学习模式,在工作中将模式运用到实践中,实践是检验真理的唯一标准。

       6。选择良好的工具,公欲善其事,毕先利其器,良好的IDE能将系统模型用UML语言表达出来,比如JBuilder等,选择一款适合自己的就行。

       7。选择良好的素材,个人觉得JDK和Spring 、Struts、Hibernate中已经包含了丰富的设计模式,而且他们和我们是那么的贴近,这些都是经的起考验的现成的好例子,何必舍近求远呢。只要你有兴趣,好学,肯努力,定会有所收获。

 

 

       本来是想写篇设计模式的方法讨论文章的,写着写着竟走了样,先搁这吧,以后跟大家一起学习设计模式。

分享到:
评论
1 楼 javasocool 2010-04-22  
没吃过猪肉,还没见过猪跑

相关推荐

Global site tag (gtag.js) - Google Analytics