1.2 案例的定量评估
我们依据以下指标对8个C++(www.cppentry.com)开源项目进行定量化评估。
1.学生兴趣。从教育心理学角度,如果学习者对一个开源项目感兴趣,他就会积极主动地探询C++(www.cppentry.com)的语言特性是如何被应用在他所关注的项目中的,这可以大幅提高学习效率。为了得到定量的数据,我们对南开大学软件学院114名一年级本科生进行了问卷调查。具体地说,我们演示了这8个开源项目的功能,让每个学生独立地填写一个调查表。每个学生对一个项目感兴趣的程度用数字1~5表示,5表示最感兴趣,1表示最不感兴趣,感兴趣程度从1到5逐渐过渡。最后我们计算所有学生对一个项目兴趣程度的平均值。
2.代码规模。规模太大的开源项目将大幅增加学习者的学习难度和学习周期,规模太小的项目将无法展示C++(www.cppentry.com)语言解决复杂问题的能力,我们需要在两者之间折中。我们依据源代码行数(Line of Code,LOC)以及源代码中的类型数量来评测一个项目的规模。
3.代码质量。精确地评估一个软件系统的代码质量是比较困难的,这需要专家仔细研读软件的代码以及文档,评估其设计是否精良,是否具有良好的可扩展性、可移植性,源代码是否严格遵循某种编码规范,评估其运行时的性能、健壮程度等。8个C++(www.cppentry.com)开源项目的代码总量约为53万行,进行人工评估显然是不现实的。我们选择以下两个可以量化的指标来评估一个项目的代码质量。
(1)代码中注释部分的比例。适当比例的注释可以提高代码的可读性,同时也能体现编程(www.cppentry.com)人员的仔细与严谨。
(2)内聚性(cohesion)。所谓内聚性,是指一个类的成员变量和成员函数之间的耦合程度。较高的内聚性往往意味着较高的代码质量。有多种度量内聚性的方法,我们采用LCOM-HS(Lack of Cohesion of Methods,提出者为Henderson-Sellers)度量,其取值范围为0~2,越大表示内聚性越差。
4.C++(www.cppentry.com)特性的应用。有的开源项目虽然宣称是使用C++(www.cppentry.com)语言开发的,但是大部分代码是C语言编写的,只用到"封装"这样简单的C++(www.cppentry.com)特性。为了评判一个开源项目是否大量使用了C++(www.cppentry.com)特性,我们选择了以下三个指标。
(1)名字空间(namespace)的个数。在一个中、大型软件项目中,合理使用名字空间可以有效避免名字冲突,提高软件系统的模块化程度。
(2)继承的个数。类的继承是面向对象编程(www.cppentry.com)思想的典型特征,是实现多态性的必要条件。
(3)模板(template)的个数。除了使用面向对象思想,现代C++(www.cppentry.com)项目还大量使用模板技术,以实现泛型编程(www.cppentry.com)(generic programming)的思想。
以下工具可以定量地评估一个C++(www.cppentry.com)项目的规模与质量。
(1)SourceAudit(www.frontendart.com),由FrontEndART公司开发,该工具甚至还可以分析出C++(www.cppentry.com)程序中是否应用了设计模式。
(2)Telelogic公司的logiscope,对一个软件系统的可维护性、可重用性、可测试性、可读性等进行评估。该公司于2008年被IBM收购,该产品演化为Rational Software Analyzer。
(3)CppDepend(www.cppdepend.com),能够对C++(www.cppentry.com)程序进行60多个指标的测量,其中有些是关于代码结构的(如类及名字空间的数量),有些是关于代码质量的(比如程序注释比例,内聚性,项目稳定度等)。该工具还可以直观地显示程序模块、类、函数之间的依赖性。它将被分析的源代码当作数据库来处理,允许用户使用一种代码查询语言(Code Query Language,CQL)对源代码做各种分析。
由于CppDepend小巧(约8.6M字节)、灵活(支持代码查询语言)、被允许在学术机构中免费使用,我们选择了该工具。它生成的分析报告只含有部分评估指标,我们应该使用代码查询语言获得其他评估指标。关于该软件的使用(尤其是代码查询语言的规范),请参考其官方网站,本文不再赘述。
8个C++(www.cppentry.com)开源项目的定量化评估结果如表1 1所示。由于整个Qt库的规模太大,我们仅选择了其核心模块QtCore以及QtGui作为分析对象。表中,LOC表示代码行数(Line Of Code),Types表示类型的数量,Comm表示注释行与总代码行的比值,LCOM表示内聚性较差的类在所有类型中的比例,NSpace表示名字空间的数量,Templates和Inherits分别表示模板与继承的数量。
表1 1 8个C++(www.cppentry.com)开源项目的定量化评估结果
续表
学生们最感兴趣的是Qt,这归因于该软件包的示例程序所展现的强大的图形/图像处理能力。其次,学生们感兴趣的是K3DSurf,这归因于该软件所展现的精美的数学函数曲面。Qt、Celestia和Winmerge都大量使用了名字空间、模板以及继承,表明它们都能成为C++(www.cppentry.com)语言的案例。由于学生们对Winmerge不感兴趣,我们应该在Qt和Celestia两者中选择一个。考虑到Qt不但可以作为C++(www.cppentry.com)语言的案例,同时也是一款功能强大的跨平台C++(www.cppentry.com)类库,研究该类库不但可以学习C++(www.cppentry.com)语言特性,还可以使用它来开发桌面应用程序,因此,我们最终选择了Qt。