IT餐馆—第三回 模式

     就在上回聚会后不久,杜鹏就在 MSN上联系雨辰,说他们公司最近新招来了两个新人,
其中一个小伙对设计模式很感兴趣,没事就找老杜聊怎么学这个东西,老杜想起雨辰前些
年总爱在酒桌上与大家聊这些话题,所以就想单独约雨辰出来给那个小伙讲讲。

     雨辰因为最近产品要发布测试版有些忙,所以就约在三天后的周六中午在王利的餐馆
碰头。就这样,雨辰周六中午早早就到餐馆随便点了两个菜先吃了起来,就在这时,老杜
带着那个年轻人走了近来,看样子小伙像刚大学毕业没两年的样子,带着眼睛,很腼腆。
一走到雨辰面前就马上伸出手,嘴里说着:“雨哥,您好,今天打扰了”。

     雨辰赶忙招呼小伙和老杜坐下,又点了三瓶啤酒,让过菜谱给小伙,让他点些自己可
口的菜。小伙不好意思的说:“随便随便”,老杜抢过菜谱对小伙说:“别客气,咱们是AA
制,所以随便点爱吃的就行,呵呵。”

     就在老杜翻着菜谱的时候,雨辰笑着对那个小伙说:“小兄弟,听老杜说了你的一些
情况,我只是有个疑问就是你怎么想研究设计模式这方面的东西呀?”

     “主要是感觉里面挺高深,一大堆天书似的概念,所以好奇才一直瞎瞧,只是不得其
法,不知道该怎么学,怎么用。” 小伙有些迷茫的说着。

     雨辰笑着说:“我知道了,其实我当初跟你也差不多,对于技术人员而言必定好奇心
和兴趣是最大的动力。不过在学习设计模式之前最好先要把基本打好,面向对象语言里的
继承封装,多态,重载等你之前都接触过吧。”

     小伙说:“上大学的时候学过,这些年工作上也用上了。”

     雨辰点了点头说:“那就好,这可以说省了不少的事。说白了,设计模式就是建立在
面向对象设计思想基本上的,按面向对象编程中的原则,在特定应用场景下的实现‘特例’,
所以说每个模式都是一个特例,一个特定场景下的特例。”

     小伙若有所思的说:“好像听明白了一些,但还是有点不清楚 。”

     雨辰笑着继续说:“SRP,OCP,DIP,LKP,这些名词你都听过吧?”

     小伙点了一下头说:“在大学里上课是听老师说过,后来看书也多少了解了一些。”

     雨辰接着说:“那就好办了,其实这些设计原则就是设计模式所遵循的准则,比如说
OCP原则,也就是‘开关原则’,其核心就是‘设计应该能够容纳新的功能需求的增加,但
是增加的方式不是通过修改又有的模块(类),而是通过增加新的模块(类)来完成的。
而设计模式中大多数都是遵循这一原则的,比如说Strategy和抽象工厂模式。”

     雨辰边说边给老杜和小伙各倒了一杯啤洒,然后接着又说:“而LKP,也就是最少知识
原则也有相应的模式实现—‘Facade’模式。”

     小伙想了一想,点点头说:“策略模式之前用过,现在想起来还真是这么回事,那您的
意思就是说这些原则是基础,要想学好模式,就要先理解并用好这些原则。”

    “是的,的确如此,这是攀登模式这栋高楼的梯子,没有它,你要走很多的弯路,甚至
会半途而废。”雨辰肯定了小伙的话。

    “那您说等把这些原则都掌握了之后,要先从那几个模式学起呀?” 小伙继续问着。

     雨辰想了一想说:“Singleton,Façade,Decorate和Strategy模式,这四个模式用
的很广,并且在类的关系结构上也比较清晰,学习上没什么太多的困扰。”

     这时老杜也点了两个菜,放下手中的菜谱说:“你们二位还真谈上了,看来我省事了,
呵呵。”

     然后老杜转过头,对身边的小伙说:“其实你平时在咱们项目中用的那几个模式有些过于
拘泥于书中所说的,动不动就把书中的类全部一对一的敲到代码中。”

     老杜喝了一口啤酒继续说:“如果这样死学的话,如果哪天别人把你看的书里的类图变了
一下,你就犯晕了,其实模式其自身的类图和实现示例只是一种参考,如果死按这些内容
去开发的话,不晕死才怪。”

     雨辰点了点头,其实早在Joshua Kerievsky的书Refactoring to Patterns 中就已提
这这个问题,甚至还把一些模式存心变个样子(换另一种实现方法)整个马甲出来,目的
就是要让大家不要过于拘泥于图和代码,而应该从‘神似’而不是‘形似’来理解和使用模式。

     小伙听得有些似懂非懂,问雨辰:“我和我身边的朋友都是从示例代码一步步学过来的,
如果不看代码和类图的话,肯定是理解不了书中所说的那些抽象概念的!”

     “看归看,但不必对那些代码过于计较,主要理解设计模式意图就可以了。其实在学习
设计模式时,按我的理解可以分为三个阶段。” 雨辰笑着说。

       小伙来了精神,追问:“哪三个阶段呀?”

     雨辰喝了口啤酒,慢慢的说着:“第一阶段就是你目前所处的这个阶段,即对书照猫画
虎。当了解几个模式之后,就开始在项目或自己设想的应用场景中有空就去尝试一下,基
本上是一边看书一边敲代码。”

     小伙点点头:“没错,你说的太对了,目前我就是这种情况,经常刚看完的模式就想马
上找个项目来练手,呵呵。”

     雨辰笑着说:“你可以在自己的DEMO或想像中的场景中尝试这些模式,但决不应该掌
客户的项目来练手,因为到头来如果使用不当,你和客户都会被模式这把‘双刃剑’所伤。”

     小伙叹了口气:“听雨哥这么一说,我才开了窍,惭愧。那第二个阶段呢?”

     雨辰接着说:“呵呵,只要你舍得死我就舍得埋(郭德纲的经典语录,雨辰把这句话变
成口头禅了)。第二阶段要比第一阶段累心,因为这是一个要不断把已学习过的模式翻来覆
去品味的阶段。目前假如你只学了四五个模式还好说,必定它们之间的差别还比较明显。但
当你看了更多的模式并把他们综合思考的话,你会发现这些模式当中有不少模式从代码或类
图上看有些像是‘一个妈生的’,比如Strategy, bridge, state这三者,还有Builder和抽象
工厂等等。所以到这个阶段就要充分比较模式之间的差别,关联,分析具体的应用场景了。
当然模式就其性质分为创建型,结构型和行为型,当你在不同类型的模式间学习比较时,从
其所属类型上你也会分析出一些线索。”

     小伙仿佛已看到了自己在第二阶段时为了模式而抓狂的情景,但还是不免好奇的问:“
那过了这一关,第三阶段是什么呢?”

      雨辰仿佛从小伙的眼中看到了自己当年的影子,很高兴的说:“那就是‘无模式’了,忘掉
所有的模式和代码,回归面向对象设计本身,在自己的程序中遵循我们刚说过的面向对象的
那些原则,不要刻意在你的代码中为了使用模式而使用模式,而是通过重构和完善已有代码
的方式,润物细无声的使用模式。到那时当别人再看你的代码时,看到的是可扩展性强,可
复用性高,可读性强,可维护的代码了。到了那一天,你可以说已把面向对象的精髓参透了。”

     小伙这下被彻底整蒙了,真没想到结果会是这个样子。

     看着小伙一脸迷惘的表情。雨辰意味深长的说:“如果不能完全听懂没关系,必定刚才
用了十多分钟所说的内容,是我用了三年才参透的,总有一天你会知道的,到那时你就可
以和我一起唱‘Only you’了,呵呵。其实很多人在第二阶段就当了逃兵,我相信你不是那
种轻言放弃的人,努力吧,呵呵。”

     小伙回过神了说:“那除了看书,还有什么更多的方式来学习模式呀?”

     “分析源码,特别是国外的开源项目中的源码,当然你也可以找一些有关源代码分析的
书籍来看,必定看别人怎么用设计模式的,要比自己一天倒晚瞎琢磨快许多。”雨辰接着又
说:“还有就是如果你有信心和时间,可以看看我们每天都在用的.NET框架的代码,你可以
使用reflector这类工具来进行分析,必定看的场景多了,自然而然就会摸到门道儿了。”

     小伙好奇的问:“难道.net框架中也有模式。”

     雨辰笑着说:“当然有了,模式这么好的东西微软为啥不用,比如说HttpModule这个设
计就是基于Observer模式实现的。而那些TextWriter,StreamWriter,StringWriter就
是参考Decorate实现的,除此以外还有很多地方,只见你用心分析就会有所收获。”

     老杜这时说:“差不多了吧,聊了这些,菜都凉了,赶紧吃吧。”

     雨辰这时才想起来,发现聊技术时忘记桌子上的菜已被老杜干掉了不少,连忙招呼小伙
边吃边聊,就这样,一直扯到了日头快落山时才各自回家。

     …….

 

    作者: daizhj,代震军,LaoD

    Tags: IT餐馆,模式

    网址: http://daizhj.cnblogs.com/

    原文链接:http://www.cnblogs.com/daizhj/archive/2009/07/13/1522252.html

 

posted @ 2009-07-15 08:07 代震军 阅读(...) 评论(...) 编辑 收藏