前言
最近看了《FDG 2nd Edition》,也适当做了些笔记,在这里写这篇文章的目的主要有两个,一是对自己学习的一个记录、积累;另外,还可以用这篇总结向一些有需要的朋友推荐这本书。
书籍总结
这本书是MS公司的框架设计师,经过多年框架开发后的经验总结。
首先,它是一本设计规范。该书从规范的角度,规定了一个好的框架应该满足哪些条件、不应该犯什么错误。它从粗细不同的各个维度详细地列出了很多规范,细则细到变量名的命名,粗得粗到.NET中的模式应用规范。(早知道有这样一本书,我们就可以不用再为项目组编写代码设计规范了。哈哈。)
其次,这不但是一本“规范”,更是一本.NET平台上进行程序设计的指导书。
该书的前两章,讲解了一个好的框架应该满足哪些设计规约,例如简单易学、高一致性、自成文档、可升级性、易集成性等,并说明了这些性质对于一个框架来说为什么那么重要,甚至有时比一个框架的功能都还要重要。同时,还说明了在MS这样的公司,框架是怎么被开发出来的,例如其中用到了:框架用例分析与定义、场景驱动设计、TDD 等。
书中的第 3 章到第 8 章,主要列出了从命名,到类型设计,到类成员设计等一系列的规范。它对每一条规范进行解释,为什么要这样,这样有什么好处。例如,其中的一些规范看上去好像不是最好的,但是他们解释到,框架设计本身充满了抉择,当代的程序开发中,设计不能只考虑程序本身,还应该考虑集成开发环境在其中所扮演的角色。这几章中,最重要的莫过于第 6 章“扩展性设计”了。“一个OO模式的框架如何进行扩展?”“如何扩展更加简单易用更加流畅更加高效?”“事件好,还是虚方法好,怎么灵活使用它们?”一个好的开发框架,往往不只是实现功能那么简单,如何对框架进行扩展,经常也是框架设计师考虑得最多的。 这一点我个人深有体会,例如在“OEA框架”的开发过程中,耗费我们比较多时间的地方,主要是考虑如何对界面生成的各方面进行扩展,小到属性编辑器,大到整个窗体、模块。扩展并不是理论上支持就行了,必须切实地在各种粒度上进行专门的扩展性设计,否则,一个不易扩展的框架就会变得没有意义。打比方说,如果OEA只支持整个窗体生成的扩展,而不支持在现有生成基础上进行细粒度的扩展,那相当于告诉框架的使用者:“在任何一个生成细节上,如何OEA不能支持,那么请重写整个界面”,我相信没人会用这样的框架。扩展性设计的重要程度,还可以在框架本身的定义上看出来:“支持以某种回调机制进行扩展的软件半成品”。
第 9 章,也是最后一章,“通用设计模式”。本章的第一节相对来说较为重要:在API设计中,类型通常被分为两类来进行设计。一类是 Aggregate Component,是高层的API类型;另一类是 Factored Type,同样作为API,但是却提供更底层的控制。两种API概念不同,使用方法不同,设计方案也不尽相同。API的设计对于框架来说,也是举足轻重的一件事。随后的几节中,或多或少地都与这两个概念相关。主要还是讲了一些独立的设计模式,如:Async Pattern, Dispose Pattern, Factories, LINQ Support, Optional Feature Pattern, Simulating Covariance, Template Method 等。我就以工厂模式为例,来做一点总结:1. 直接使用构造函数,不能解决动态类型的构造,不能进行对象的管理(例如缓存)。 2. 工厂模式牺牲了可发现性、可用性及一致性来实现了灵活性,所以在使用时需要注意不被滥用。
后话
我之前一直没有看这本书,全靠自己不断地编写代码,不断地靠主观来分辨某个设计是不是好的。虽然现在感觉书上写的很多规范,其实自己已经慢慢地被“默化”了,但是感觉还是走了不少弯路。其实自己当初追求设计的美感,完全是靠模仿。在不断地学习.NET类库中,看别人是怎么写的,然后自己也跟着学,不断一点一点加强自己的设计能力。这些类库,一般也都是MS开发的。这样,久而久之,当一个设计放在面前的时候,一眼就能从API规范角度上看出它是否属于好的设计。
这里,我推荐以下任何一种类型的读者阅读这本书:
- 专注于.NET平台的任何开发人员。
- 理解了一般设计思想,但是想在.NET平台上深化设计的软件设计师。
- JAVA及.NET平台的框架设计人员。
- 想与和.NET类库一样优美代码的朋友。 :)
(
模仿是很重要的一个学习方法。
这里,顺便总结一下另外一本书中学到的理论。为了提高自己的表达能力和口才,看了一本老婆推荐的书:《思维导图:提高语言智能的十种方法》。最终发现其实这本书对于社交和口才并没有什么关系。它分析了刚出生的孩子是如何学习语言的,然后总结出一些可以帮助外国人提高语言学习能力的技巧。但是这些技巧并不能提升交际能力,一是因为它们无法直接应用在汉语上,二是国内交际的重点并不是汉语的语法。
但是,想要学好英语或者想多学几门外语的话,不妨看看这本书,对于提升自己的语言学习能力,确实不错。
程序语言本身可以理解为一门外语,所以对于开发人员来说,这也算是蛮有用的。
这里,我列举一下脑中还记得的,学习语言的一些关键要素:
- 模仿
- 游戏。在游戏中学习,会事半功倍。
- 心态:热爱学习。
- 错误、失败都不要放在心上。想想小孩子。
- 坚持不懈。
)