《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. 坚持不懈。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏服务端技术杂谈

不要和一种编程语言厮守终生:为工作正确选择

我们程序员在着手一个项目时,需要做的关键决定之一就是选择一种语言,或一组语言,用于实施该系统。这一决定不仅会影响系统的实现,也会影响设计。例如,我们应该使用面向...

2917
来自专栏Java技术栈

Java程序员必看的 13 本 Java 书籍!

毕竟,书是学习的海洋呢!So,Java程序员你们准备好了吗?双手奉上Java程序员必读之热门书单。

2774
来自专栏java一日一条

不要和一种编程语言厮守终生:为工作正确选择

我们程序员在着手一个项目时,需要做的关键决定之一就是选择一种语言,或一组语言,用于实施该系统。这一决定不仅会影响系统的实现,也会影响设计。例如,我们应该使用面向...

922
来自专栏phodal

那些年,你应该读的7本Beautiful计算机书

O'Reilly Beautiful系列的电子书都是相当不错的文章合集,不仅可以扩大我们的市场,还可以装逼~~。 很多年前,有一本叫《代码之美》的书预售的时候,...

2146
来自专栏web前端教室

我理解与实施的学习前端的路径

随着微信小程序的出现,前端的知识愈加的碎片化。没有哪个知识能够搞定一切。 在很久以前我可以说,你会做静态页面html就可以啦,那年月都用table表格做页面。后...

1758
来自专栏北京马哥教育

Python风靡全宇宙,首要原因是它?

就让我们从近年来大数据的兴起说起,为你娓娓道来Python火爆的真正原因。 众所周知,Python是目前使用最广泛且用户增长最快的编程语言。优雅简洁的语法、强...

2757
来自专栏企鹅号快讯

谁适合学Python?学了Python可以做什么工作?

Tips: 目前在很多行业中都在越来越多的应用Python,这也是很多行业学习Python的原因,Python主要的应用领域有哪些呢?今天我们就来详细看一下。 ...

1.2K5
来自专栏Java架构师进阶

“野生”程序员面对阿里社招面试应该如何准备才能事半功倍呢?

我会分为四个部分来谈论这个问题,由于LZ本身是Java出身,因此关于主语言的问题,都是与Java相关,其它语言的同学可以选择性忽略。此外,面试的时候一般面试官的...

1024
来自专栏大数据挖掘DT机器学习

如何处理 Python 入门难以进步的现象?

问题: 如何处理 Python 入门难以进步的现象? 看视频看呀看呀看, 看完了,基础的都懂了 然后就想写点东西 可是无从下手呀,我以为基础不扎实,又去看视...

3784
来自专栏JAVA烂猪皮

如何成为10倍速的程序员

国外有个词叫做10x Programmer,直译是以一当十的程序员。我并不认为一个技术大牛能完成10个普通程序员的工作,技术大牛会花1/10的时间把工作做完,然...

1272

扫码关注云+社区

领取腾讯云代金券