《Framework Design Guidelines 2nd Edition》推荐

简介:

前言


    最近看了《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规范角度上看出它是否属于好的设计。

    这里,我推荐以下任何一种类型的读者阅读这本书:

  1. 专注于.NET平台的任何开发人员。
  2. 理解了一般设计思想,但是想在.NET平台上深化设计的软件设计师。
  3. JAVA及.NET平台的框架设计人员。
  4. 想与和.NET类库一样优美代码的朋友。 :)

 

    模仿是很重要的一个学习方法。

    这里,顺便总结一下另外一本书中学到的理论。为了提高自己的表达能力和口才,看了一本老婆推荐的书:《思维导图:提高语言智能的十种方法》。最终发现其实这本书对于社交和口才并没有什么关系。它分析了刚出生的孩子是如何学习语言的,然后总结出一些可以帮助外国人提高语言学习能力的技巧。但是这些技巧并不能提升交际能力,一是因为它们无法直接应用在汉语上,二是国内交际的重点并不是汉语的语法。

    但是,想要学好英语或者想多学几门外语的话,不妨看看这本书,对于提升自己的语言学习能力,确实不错。

    程序语言本身可以理解为一门外语,所以对于开发人员来说,这也算是蛮有用的。

    这里,我列举一下脑中还记得的,学习语言的一些关键要素:

  1. 模仿
  2. 游戏。在游戏中学习,会事半功倍。
  3. 心态:热爱学习。
  4. 错误、失败都不要放在心上。想想小孩子。
  5. 坚持不懈。


本文转自BloodyAngel博客园博客,原文链接:http://www.cnblogs.com/zgynhqf/archive/2011/03/07/1976374.html,如需转载请自行联系原作者

相关文章
|
1月前
|
编译器 程序员 定位技术
C++ 20新特性之Concepts
在C++ 20之前,我们在编写泛型代码时,模板参数的约束往往通过复杂的SFINAE(Substitution Failure Is Not An Error)策略或繁琐的Traits类来实现。这不仅难以阅读,也非常容易出错,导致很多程序员在提及泛型编程时,总是心有余悸、脊背发凉。 在没有引入Concepts之前,我们只能依靠经验和技巧来解读编译器给出的错误信息,很容易陷入“类型迷路”。这就好比在没有GPS导航的年代,我们依靠复杂的地图和模糊的方向指示去一个陌生的地点,很容易迷路。而Concepts的引入,就像是给C++的模板系统安装了一个GPS导航仪
104 59
|
6月前
|
存储 程序员 编译器
Modern C++
Modern C++
|
Oracle 关系型数据库 MySQL
Website Cloud Architecture Best Practices
Most corporate users can customize their technical architecture according to individual business needs, achieving a Web-scale IT system design.
2905 0
Website Cloud Architecture Best Practices
|
JavaScript 前端开发 Java
|
数据库 数据库连接 Android开发
|
程序员 API 数据库