1.1 案例的初步选择
第1章 案例的选择与评估
C++语言的学习者往往希望有一个源代码公开、质量上乘的C++项目作为学习的范本来临摹。这种案例最理想的来源是知名软件企业使用C++开发的产品,比如微软公司开发的Windows操作系统、Office办公组件,苹果公司开发的MacOs操作系统,Google公司开发的Chrome OS操作系统或者Adobe公司的Photoshop。但显然,这些公司出于商业利益不会公开这些产品的源代码。幸运的是,软件开源运动为C++学习者提供了成千上万个可供借鉴的项目,我们可以在这些项目中遴选出质量高、文档完整、适合C++学习者的案例。
由于C++开源项目数量众多,我们分两个步骤进行遴选。
(1)初步筛选阶段,我们主要依据一个开源项目受关注的程度、该项目是否涉及太多的专业知识来选择。这个阶段我们选择了8个开源项目。
(2)定量评估阶段,我们使用CppDepend工具,评估每个开源项目的代码规模以及代码质量,最终选择了Qt。本章1.1、1.2节详细描述这个过程,读者可以借鉴其中的方法选择其他C++案例,或者在学习其他编程语言时,使用其中的方法选择对应的案例。而且,读者还可以使用这两节讨论的工具CppDepend剖析其他软件的结构与质量。
C++开源社区还有其他优秀的项目,1.3节简要介绍了其中的Boost库以及KDE开发框架。Boost库大量使用了模板技术,某些技术对C++初学者来说过于深奥。而KDE是在Qt基础上构建的一个开发框架。在掌握本书的内容后,读者可以继续研读KDE或者Boost,以进一步提升C++语言的应用能力。
本章1.4节介绍本书对术语等的约定,1.5节专门讨论在UML类图方面的约定。这两节和本章主旨没有关联,但是将它们放在书的前言部分又显得太长,因而只好将它们放在此处。
1.1 案例的初步选择
我们从以下网站搜索开源项目:
(1)Sourceforge(sourceforge.net),这是最著名、历史最悠久、规模最大的开源项目管理网站。
(2)Google code(code.google.com),它的访问速度快,是开源项目管理网站的后起之秀。
(3)C++创始人Bjarne Stroustrup的个人网站www2.research.att.com/~bs/applications.html,其中罗列了一些优秀的开源C++项目。
(4)开源中国社区(www.oschina.net/project/lang/21/c)。
世界上使用C++编写的开源项目很多,比如截至2011年12月仅Sourceforge上就有6450 个C++项目。如何在这么多的项目中选择一个优秀案例呢?我们分两个步骤来选择:
第一,初步筛选。依据一些定性的指标,比如一个开源项目被用户关注的程度、该项目是否涉及太多的专业领域知识等,选择少量项目。
第二,定量评估。依据代码规模、注释内容比例、类的内聚性等指标,对各个项目进行定量地评估,选择最优者作为本书剖析的对象。
初步筛选阶段,我们采用了以下指标。
① 关注度。一个开源项目的关注度高,说明该软件实用、在同类软件中性能更好。由于得到用户的关注,该项目的开发小组就能够持之以恒地对软件进行改进,该项目的源代码质量就会更高。我们依据每周用户下载次数对开源项目进行排序,忽略那些下载次数少的项目。
② 涉及其他专业领域的程度。由于C++课程往往是软件专业学生的基础课程,当他们学习C++语言时,对其他专业领域了解不多。如果将那些涉及较深专业知识的项目(比如电路板自动布线系统、编译系统等)选为案例,学生将花费很多时间去学习和C++不相关的知识,这将降低学习效率。
依据以上指标,我们选择了8个C++开源项目。读者可从前文所述的开源网站下载这些项目的源代码以及安装程序,然后将这些项目安装在自己的机器上,体验它们的功能。以下是除了Qt以外的其他7个项目的简要介绍。
Celestia。以三维方式显示宇宙间10万颗星座的位置、形状信息。对于那些已有影像数据的星球,该软件能显示这些星球的表面图像,令用户感觉似乎是驾驶一艘宇宙飞船在星际间畅游。自2001年该软件被免费发布以来,已有3百万次下载,并被广泛地用在家庭、学校、政府机关等场所。该软件的官方网站为www.shatters.net。安装该软件之后,读者可以执行"帮助/系统演示"命令,体验星际旅游的乐趣。
K3DSurf。能够以非常漂亮的三维形式绘制多元数学函数的表面。
WinDirStat。能够计算并显示本地文件系统中各个子目录的字节数,也能够依据文件的类型(比如临时文件、MP3文件等)对文件进行分类,并显示每个类别的字节数。计算机用户可以使用该软件察看各子目录、各种类型文件占用磁盘空间的情况,删除那些不再使用的文件,以释放出更多的磁盘空间。
Source-Navigator。能够分析C、C++、Java等语言的源程序中各种部件(如函数、类)之间的关系,并以图形化的方式显示这些关系,还允许用户查询各个部件之间的关系,比如某个函数调用了哪些函数,该函数又被哪些函数调用。开发者可以使用该软件来查看、理解一个复杂软件的总体结构。
Notepad++。是运行在Windows操作系统之上的一款文本、源代码编辑软件。除了具有同类软件的常见功能之外,它支持Unicode,允许用户使用鼠标滚轮即可放大/缩小字体,支持多达52种编程语言、脚本语言以及标记语言。
WinMerge。能够比较两个文本文件的差异,也能比较两个文件夹中哪些文件存在差异。程序开发者可以使用该软件比较一个源程序的多个版本,以快速澄清各个版本的差异。
CppCheck。能够检测C++程序中的逻辑错误(而不是语法错误),比如,一个类在重载"="运算符时,应该返回this指针所指对象的引用。