C++ API 设计 03 序言(一)

2014-11-24 09:43:01 · 作者: · 浏览: 2

序言

使用C++来开发大型应用程序是一件困难和棘手的事。然而,要设计可重用的C++接口且健壮、稳定、易用和耐用,更是难上加难。要想在这方面取得成功的最好方法就是:坚持良好的应用程序编程接口(API)设计原则。

每个API都为某个软件组件提供一个逻辑接口,并隐藏需要实现的该组件的内部细节。它为一个模型提供了高层次的抽象,并促进通过允许多个应用程序共享相同功能促进代码重用。

现代软件开发已经高度依赖API,从底层的应用程序框架到数据格式API和图形用户界面(GUI)框架。事实上,常见的软件工程术语,如模块化开发、代码重用、组件化、动态链接库(DLL)、软件框架、分布式计算和面向服务的体系架构都非常依赖强有力的API设计能力。

你可能已经知道一些流行的C和C++的API,包括标准模板库(STL)、Boost、Microsoft Windows API (Win32)、Microsoft Foundation Classes(MFC)、libtiff、libpng、zlib、libxml++、OpenGL、MySQL++、Trolltech的Qt、wxWidgets、GTK+、KDE、SkypeKit、POSIX pthreads、英特尔的Threading Building Blocks(线程构建模块)、Netscape 插件API和Apache模块API。此外,还有很多Google的C++开源项目是C++的,sourceforge.net、bitbucket.org和freshmeat.net网站上也有很多。

这些API在软件开发的各个领域中都有用到,从桌面应用到移动计算和嵌入式系统,还有就是Web开发。例如,Mozilla的火狐Web浏览器就是建立在80多个动态库之上的,每个都为若干个API提供了实现。

因此,优雅和健壮的API设计是现代当代软件发展的重要方面。其中有个重要的地方和标准的应用开发不同,那就是更需要应变管理。我们都知道,变化是软件发展的必然因素:总会有新的需求、功能要求和错误修复,这些对软件的完善都是在刚开始设计时无法事先预计的。然而,修改有众多最终用户程序所共享的API,可能导致出现很大的问题,甚至让用户客户放弃这个API。因此,良好的API设计的主要目标就是为用户提供你客户所需要的功能。当你发布新版本时,同时对他们的代码造成的影响也降至最低---(最理想的情况是没任何影响)。

---此处插入黑色分割线---

为什么你需要读这本书

如果你编写的C++代码给其他工程师用的,你是一名API设计师的话,那么本书就是为你量身定做的。

接口是最为重要的代码,因为如果接口出现问题,那么修复它的代价比修复实现部分的代价要高很多。例如,改变一个接口可能导致基于它的所有程序都要进行相应的代码更新。然而,通过修改实现部分可以透明地集成到客户端程序中去,这样就可以轻松采用新的API版本。从经济角度上看,设计不良的接口将极大降低代码的生存期。学习如何编写高质量的接口是一个重要的工程学技能,这正是本书的中心点所在。

正如Michi Henning指出,比起20年前,今天的API设计更为重要了。这是因为,很多API都是近年开发出来的。这些API也提供更为丰富和复杂的功能,也被更多的终端程序所共享(Henning, 2009)。除了这些,现在市面上还没有一本专注于C++ API 设计的书。

值得一提的是本书并不是普通的C++编程指南,市面上已经有好多这种书了。我会讲到很多面向对象设计的例子和很多实用的C++技巧。不过,我会专注于C++简洁的模块化接口技术。因此,我不会深入说明这些接口里面的实现是如何完成的相关问题,例如到底该选择哪个算法或者某个函数体花括号里面的代码到底有什么限制。

不过,本书将涵盖API开发的所有阶段。从刚开始的设计到实现、测试、文档、发布、版本控制、维护和否决废弃(译者注:废弃术语Deprecation 指软件中某些特性已经被否决废弃,应避免使用。虽然在当前版本中还有保留,不过使用它们的时候会给出警告信息)。我还会涵盖专门的API主题,如创建脚本和插件API。虽然这些主题也和普通的软件开发有关,但是这里的重点是针对API设计的特殊环节。例如,当讨论测试方法时,我会专注于自动化API测试技术,而不是包括终端用户应用程序测试技术,如GUI测试、系统测试或手动测试。

就我写这本书的能力而言,我做为作为API开发的主管,已经为几个合作机构、内部动画系统(他们以此获得过奥斯卡奖)提供过可共享的研究代码,还有开源的供全世界数以百万计人使用的客户端/服务器端API。纵观这些不同的经历,我一如既往地感受到高质量API设计的重要性。因此,本书向您介绍了从实践中得到的极其实用的API设计精华。

谁是本书面向的读者

虽然本书不是关于C++的新手教程,但我还是尽最大努力让您容易易于阅读并清楚地解释所有的术语和行话。因此,本书对有一点C++基础的程序员新手也非常有价值,如果他们想提高自己的设计能力的话。当然,对那些已经很有经验并想学习新技术的高级软件工程师和软件架构师来说,也是一样有价值的。

当我写这本书时,我就在脑子里划定了几个读者群:

1.在职的软件工程师和架构师 初级和高级开发人员,他们在开发某个API项目,并需要实用的建议来告诉他们如何实现最为优雅和耐久的设计。

2.技术经理 程序和产品经理,他们负责开发一个API产品,他们更需要深入理解技术问题的细节和API设计的流程。

3.学生和教育者 计算机科学和软件工程的学生,他们要学习如何编程,并想学习从大型项目实践经验中得到的软件设计资源。

关注C++

虽然有很多通用的API设计方法可以学习,这些技能可以同样应用在任何编程语言或环境,但是API最终都必须用一个特定的编程语言来实现。因此,重要的是掌握这个特定语言的特点,这有助于设计标准的API。限于篇幅,本书只专注于基于C++的API设计中的问题,而不是其它所有语言。如果读者希望使用其它语言来开发API,如Java或者C#,仍然可以通过本书获益,本书是面向C++工程师的,他们为其他工程师开发和维护API。

C++仍然是大型软件项目中最广泛使用的编程语言之一,特别是需要编写对性能要求较高的代码时,C++还是最受欢迎的。因此,你的程序可以利用很多C和C++ 开发的API(其中一些我前面已经列出)。我将集中精力讲述如何利用C++开发优秀的API,并通过大量的示例代码来更好地说明这些概念。这意味着,我将涵盖C++的这些主题,例如模板、封装、继承、名空间、运算符、正确使用const常量正确性(const correctness)、内存管理、STL的使用和pimpl等。

此外,本书出版的时候将是处于一个C++变革的激动人心的时刻。目前,一个新版本的C++规范正在通过ISO / IEC标准化审核。大多数C++编译器还是符合1998年公布的标准,也就是著名的C++ 98标准。之后的一个版本是2003年修订的,纠正了一些缺陷。自那时起,标准委员会就一直致力于制定一个重要的新版本。这个版本的非正式名称是C++0x,直到该标准被批准和正式发布日期确定后才会确定正式名称。当你阅读本书时,新标准可能已经公布了(译者注:在本书翻译时,正式的新标准尚未公布。最