1. 我眼中的计算机
前两天看到一句话,说是计算机科学不是科学,同计算机也没什么关系。前面一半我是一直赞同的,因为自从接触到Tanenbaum那篇关于计算机专业学习的十条定律后,就开始把计算机专业当成一个工程专业来对待,而不是像物理、化学一样的科学专业来研究;而后一部分,老实说开始还是有些不爽的,但是细想来,大学里面学到的东西除了公共基础课程外,一部分是关于数理逻辑的,另外一部分是关于电子电路的,剩下的则是计算机理论方面的,说计算机本身有些什么东西,那也是数学、物理等其他专业给的。而最近又知道很多算法在数学上是成立的,但是计算机却是无法实现的,或者即使实现,也别想在太阳系毁灭之前拿到结果,也就坦然接受了。
说到程序设计,我自以为是对现实事物和流程的一个模拟。因此对于现实事物的分析方法,同样可以用在程序设计之上。对现实事物的模拟产生的是抽象的数据结构,对于现实流程的模拟产生的则是或明或暗的程序流程。以下就是我对程序设计持有的观点:
Ø 当认知现实事物时,经常使用的工具是分类和归纳。做程序设计同样如此,不过分类和归纳是发生在程序设计之前,而程序设计则针对每种分类作出相应的处理。通常情况下,special case是不受欢迎的,也是违反认知规律的。
Ø 程序设计还应该做到封装可以预知的变化,而封装变化,大多意味着提供一个间接层,也就是交互接口。对于不可预知的变化,除了瞎猫碰到死耗子情形外,是功效有限的。
Ø 对于软件来讲,即插即用是一个相对遥远的目标,生成可复用的模块是一个现实的目标。
2. 设计模式学习方法
大多数人一谈到设计模式,首先想到的基本上就是GOF的那本《设计模式 可复用面向对象软件的基础》。不过这本书理论色彩比较浓厚,比较难于理解。我自己摸索出了一条比较平缓的学习设计模式的路线,相对来讲比较适合缺少经验的人。以下仅代表个人观点。
1) 准备工作
很多设计模式都或明或暗使用到了接口的概念,也就是定义一个基类用于声明相互操作的功能集合,然后使用继承类来根据不同情况给予不同的实现。这里需要首先理解两个概念,一个是继承,另一个是虚函数。特别是对虚函数的实现原理以及运行机制的了解。在这里推荐阅读《深度探索C++对象模型》,重点是第四章(Function语意学)和第五章(构造、析构、拷贝构造语意学)。
《深度探索C++对象模型》
作者:Stanley B. Lippman
当然,在阅读过程中,适当的编码练习是需要的。
2) 初步进阶
每个设计模式的学习难度各有不同,因此从比较容易理解的模式入手,小心仔细理解就成为了这时的重点。在这里推荐阅读《设计模式解析》,最好是能够通读所有章节。如果时间不充裕的话,则可以选择阅读Adapter,Bridge,Strategy和Observer模式,重点查看这些模式是如何使用接口继承来封装变化。到目前为止,头脑里各个模式大体上还是相对孤立的。
《设计模式解析》
作者:Alan Shalloway, James R. Trott
3) 深入学习
因为前面已经学习了一些比较容易理解的设计模式,此时学习的难度就需要增加。推荐的书是久负盛名的GOF的《设计模式 可复用面向对象软件的基础》。这本书的特点是理论色彩比较浓厚,理解起来需要比较多的时间。在这里需要建立一个概念,就是模式不是孤立存在的,在实际使用时,一个模式往往需要用到另外一个模式作为自己的子模块实现,或者需要同使用另外一个模式实现的同级模块进行交互。这时自己看到的应该是一个关系网。当然没有必要把整个关系网背下来,因为实际使用的时候,往往有多种选择,而且可能还需要对使用的模式进行裁剪,以适应需要解决的问题。
《设计模式 可复用面向对象软件的基础》
作者:GOF
4) 消化理解
在学习完GOF的大作之后,需要结合一些设计模式的具体应用实例,以便加深理解。在这里推荐《STL源码剖析》、《COM本质论》和《建筑的永恒之道》。
《STL源码剖析》
作者: 侯捷
在这本书中可以学习到Iterator模式的具体应用。
《COM本质论》
作者:Don Box
在这本书中可以学习到Proxy模式的具体应用。
《建筑的永恒之道》
作者: (美)C.亚历山大
译者: 赵冰
这本书讲述了设计模式的由来。
当然还会有其他的书籍,讲述不同领域的设计模式在实际系统中的应用,则可以根据实际的需要找来阅读。
5)拓展视野
其实设计模式并不只是GOF所提到的23种,还有很多其他的模式。在这里推荐《面向模式的软件体系结构》,或许自己暂时还不能设计一个软件的整体架构,但这又有什么关系呢?一滴水照样可以折射太阳的光芒。
3. 需要注意的问题
学习任何东西都需要付出时间、精力和耐心,以下是几条忠告:
Ø 不要急于求成
Ø 设计模式更多的是一种方法论,而不是一种特定的技术
Ø 模式有它能解决的问题,也有不能解决的问题
Ø 阅读其他软件工程师的作品,看一看别人是如何使用模式的
Ø 不要认为自己会的足够多,这个世界是开放的世界,自己能够接触到的知识和技能,别人也可以接触到。要培养自己的洞察力。