本书为框架设计师和广大开发人员设计高质量的软件提供了权威的指南。书中介绍了在设计框架时的最佳实践,提供了自顶向下的规范,其中所描述的规范普遍适用于规模不同、可重用程序不同的框架和软件。这些规范经历.NET框架三个版本的长斯开发,凝聚了数千名开发人员的经验和智慧。微软的各开发组正在使用这些规范开发下一代影响世界的软件产品。\r\n 本书适用于框架设计以及相关的专业技术人员,也适用于高等院校相关专业的学生和教师阅读参考。
第1章 概述\r\n 1.1 精心设计的框架所具备的品质\r\n第2章 框架设计基础\r\n 2.1 渐进框架\r\n 2.2 框架设计的基本原理\r\n 2.3 小结\r\n第3章 命名规范\r\n 3.1 大小写约定\r\n 3.2 通用命名约定\r\n 3.3 程序集和DLL的命名\r\n 3.4 名字空间的命名\r\n 3.5 类、结构和接口的命名\r\n 3.6 类型成员的命名\r\n 3.7 参数的命名\r\n 3.8 资源的命名\r\n 3.9 小结\r\n第4章 类型设计规范\r\n 4.1 类型和名字空间\r\n 4.2 类和结构之间的选择\r\n 4.3 类和接口之间的选择\r\n 4.4 抽象类的设计\r\n 4.5 静态类的设计\r\n 4.6 接口的设计\r\n 4.7 结构的设计\r\n 4.8 枚举的设计\r\n 4.9 嵌套类型\r\n 4.10 小结\r\n第5章 成员设计\r\n 5.1 成员设计的一般规范\r\n 5.2 属性的设计\r\n 5.3 构造函数的设计\r\n 5.4 事件的设计\r\n 5.5 字段的设计\r\n 5.6 操作符重载\r\n 5.7 参数的设计\r\n 5.8 小结\r\n第6章 为扩展性而设计\r\n第7章 异常\r\n第8章 使用规范\r\n第9章 常用的设计模式\r\n附录A C#编程风格约定\r\n附录B 通地FxCop来实施设计规范\r\n附录C API规范样例\r\n术语表\r\n推荐读物\r\n索引
软件开发是一项复杂的脑力劳动,而框架作为当代软件开发的基础,其主要目标之一就是减少不必要的复杂性,从而提高开发人员的生产力。设计一个成功的框架以及可重用的软件并不容易,幸运的是本书为我们提供了指导。
本书针对的是.NET平台,但其中的许多规范与具体平台无关,因此对.NET之外的其他平台的框架设计同样具有借鉴意义。
本书主要讨论框架的设计,但事实上其中的大多数规范同样适用于普通应用程序。我始终相信,如果在设计普通应用程序时也能够遵循书中的规范,那么对进一步提高软件质量将大有裨益。
虽然我力求完美,但难免会有疏漏,为此我建立了一份网上勘误表。如果读者发现任何错误,都可以通过该网页与我联系,一旦确认我会立即将其更新到勘误表中。勘误表的网址为:www. gesoftfactory.com/ge/FrameworkDesignGuidelines/。
最后,我要感谢本书的编辑傅志红和刘江对我的充分信任,他们还提出了许多宝贵的意见和建议。此外,还要感谢我的妻子和家人,他们给我的支持和鼓励,是我前进的动力。
葛子昂
2006年4月
译者简介
葛子昂,1998年毕业于南京理工大学计算机系,目前就职于微软亚洲工程院上海分院,致力于Windows Server的相关研发。之前曾先后任职于上海育碧电脑软件有限公司和上海旭上电子有限公司,从事游戏软件的开发及图形处理器的设计。
Krzysztof Cwalina微软公司公共语言运行库(CLR)的项目经理。他曾为.NET框架的首个版本设计API,并负责任框架中的多个名字空间,包括System.Collections、System.Diagnostics、System.Messaging,等等。他也是FxCop开发组的发起成员之一。目前,他正致力于在整个公司范围内开发推广设计规范,并将其应用到.NET框架和WinFX中。
葛子昴,1998年毕业于南京理工大学计算机系,目前就职于微软件亚洲工程院上海分院,致力于Windows Server的相关研发。之前曾先后任职于上海碧电脑软件有限公司和上海旭上电子有限公司,从事游戏软件的开发及图形处理器的设计。
前 言
本书介绍了设计框架的最佳实践。所谓框架,即可重用面向对象程序库。书中所描述的规范普遍适用于规模不同、可重用程度不同的框架:
大规模的系统框架。这些框架通常都有成千上万个类型,并且为大量的开发人员所使用,如.NET框架。
中等规模的程序库。这既可以是大型分布式应用程序的可重用层,也可以是对系统框架的可重用扩展,如Web服务扩展(Web Services Enhancements)。
小规模组件。为多个应用程序所共享,如一个grid control(网格控件)库。
值得注意的是本书关注的是直接影响框架(可以公开访问的API)可编程能力的设计问题。正因为如此,我们没有过多地涉及实现细节。正如一本介绍用户界面设计的书不会讨论有关如何实现碰撞测试(hit testing)的细节一样,本书也不会讲解如何实现二叉排序。这样的定位使我们能够提供针对框架设计师的完整可靠的指南,而不是又一本关于编程方面的书。
书中的规范是在.NET框架的开发早期形成的,它们最早只是少量的命名和设计约定,但是经过不断改进、检验、提炼,这些规范最终成为了微软内部公认的框架设计规范。这些规范历经.NET框架三个版本的长期开发,凝聚了数千名开发人员累积的经验和智慧。我们并不希望本书只是基于一些理想化的设计理念,我们认为本书是极其注重实效的,微软的各开发组将之用于日常开发就是很好的证明。
本书包含许多评注,它们有的解释了相应规范的利弊权衡,有的介绍了其历史,有的给出了进一步的说明,有的提出了自己的批评意见。所有评注都来自经验丰富的框架设计师、业界专家及用户,这些源于开发一线的故事,为书中的许多规范增色不少。
为了使名字空间名、类、接口、方法、属性及类型能够在正文中一目了然,我们用Courier字体表示。
本书的读者应该基本知道如何使用.NET框架进行编程,有一些规范要求读者熟悉.NET框架2.0版引入的新特性。如果你想找一本介绍框架设计的书,那么可以参考书后的“推荐读物”,其中有一些非常好的建议。
规范的表示方法
我们通过要、考虑、避免、不要这些词把书中的规范组织成一条条简单的建议。每一条规范都描述了一种好的或是不好的做法,并用统一的方式来表示。对于好的做法,在其前面会用ü表示,与此对应,不好的做法则用û表示。每一条规范的措词也会明确表示出这条规范的重要性。例如,“要……”描述的是必须 遵循的规范(下面所有的例子都摘自本书):
要在命名自定义的attribute类时加上“Attribute”后缀。
public class ObsoleteAttribute : Attribute { … }
另一方面,“考虑……”描述的是在一般情况下应该遵循的规范,但如果完全理解规范背后的道理,并有很好的理由不遵循它时,也不要畏惧打破常规:
考虑将类型定义为结构,而不要定义为类,如果该类型的实例较小、存活期较短或通常内嵌在其他对象中。
同样,“不要……”描述的是一些几乎绝对不应该违反的规范:
不要把可变类型的实例赋给只读字段。
“避免……”就没有那么绝对,它描述的做法虽然通常并不好,但却存在一些已知的可以违反该规范的情况:
避免使用ICollection或ICollection作为参数,如果其目的仅仅只是为了访问Count属性。
对那些更为复杂的规范,我们会另外提供一些背景知识、代码示例及基本原理:
要为值类型实现IEquatable。
值类型的Object.Equals方法会导致装箱,而且由于使用了反射,因此默认实现的效率不高。IEquatable.Equals能够提供更好的性能,而且它的实现可以避免装箱操作。
public struct Int32 : IEquatable {
public bool Equals(Int32 other){ … }
}
语言选择和样例代码
公共语言运行库的目标之一就是支持多种编程语言,这其中既包括微软提供的语言,如C++、VB和C#,也包括第三方语言,如Eiffel、COBOL和Python,等等。因此,本书适用于开发和使用现代框架的多种语言。
为了加强多语言框架设计的概念,我们曾考虑过使用几种不同的编程语言来编写样例代码。但最终我们还是放弃了这种想法,这是因为使用不同的语言虽然有助于理念的表达,但这样做可能会迫使读者学习好几种新语言,而这并不是本书的目的。
我们决定使用一种易于为广大开发人员阅读的语言,最终选择了C#,因为C#是一种简单的语言,它源自C语言家族——一个在框架开发方面有着悠久历史的家族(C家族中的其他语言包括C、C++及Java)。
语言的选择对于许多程序员来说至关重要,对那些不适应C#的读者,我们谨在此表示歉意。
关于本书
本书提供了自顶向下的框架设计规范。
第1章简要介绍了本书,讨论了框架设计的理念,这是书中唯一没有规范的一章。
第2章为框架的总体设计提供了基本的原则和规范。
第3章包含了为框架各部分命名的规范,包括名字空间、类型、成员及常用的设计惯用法。
第4章为类型设计提供了规范。
第5章为类型成员的设计提供了进一步的规范。
第6章讨论了一些对保证框架的扩展性来说至关重要的问题和规范。
第7章为与异常有关的工作提供了规范,及推荐使用的错误报告机制。
第8章为扩展和使用框架中的常用类型提供了规范。
第9章为框架中常用的设计模式提供了规范和示例。
附录A对本书使用的编程约定做了简要的描述。
附录B介绍了FxCop工具。可以用该工具来分析框架的二进制文件,以验证框架是否符合本书所描述的规范。本书的配套资源中包括了此工具。
附录C是一份API规范样例,这些规范通常是微软公司的框架设计人员在设计API时创建的。
本书的配套资源 还包括了另一份API规范样例和其他有用的资源。
无封面