构件级和源码级的度量
构件级的软件度量集中评价软件构件的特性,它主要包括3C测量,既:内聚度(coheion),耦合度(coupling),和复杂度(complexity),这组测量指标贴切的描述了构件设计质量,我们也能看出各种设计模式和设计原则都在想办法平衡这些元素。
内聚度和耦合度可以通过考察构件的输入,输出参数的性质和个数,全局变量,被调用模块的个数(扇出),调用的外部模块数(扇入),得出测量数据。分析公式就不列举在这里了,公式的大概含义是如果一个模块有少的输入参数,且都是数据型的参数,没有访问全局数
据,被单一的模块调用,可以预计这个模块将有低的耦合度。关于复杂度还有一个著名的测量指标——环复杂度,它基于构件控制流图进行分析。
源码级的软件度量主要评价代码复杂度,Halstead测量套件被称为“最著名和研究最完全的软件复杂度复合度量之一”。它通过研究源代码中的操作符和操作数,开发出了一系列指标,可以描述代码的实际体积,开发工作量,开发时间,甚至软件中被预测的错误数。 很多软件测量工具都提供象耦合度,环复杂度,Halstead测量套件,扇入扇出数,等指标的自动统计,透过这些指标,我们可以掌握代码的内部特性,分析每次代码改动对代码质量的影响。一些停留在定性描述上的质量改进,完全可以通过数据得到印证。比如某部分代码采用设计模式以后提高了内聚力,降低了耦合度,某块职责众多,特别复杂的代码被拆散,所拆出的各个模块的复杂度都很低,易于维护。那么通过度量数据一定可以反应出这些特性,比如,源码级的复杂度指标降低,构件级的耦合度指标降低等等。
代码实践
下图展示了两段相同功能的代码,在重构前后的结构示意图。
ProfileConf直接使用了第三方SNMP协议包,而ProfileConfNew则使用了封装后的SNMP协议软件包。进行协议封装的目的一是为了隔离第三方软件包,另一个目的是为了简化客户端使用SNMP协议栈的操作。改造完成后,我们使用Together自带的软件测量工具进行了数据测量。选择Together菜单中tools——>metrics,里面提供了大量的测量指标。
我们选择了几个比较关注的指标,对新旧代码进行了测量,下面是测量结果。
下表对测量指标做简单说明。
通过数据可以看出,改进以后,编写的代码有所减少,大约节省三分之一的代码;耦合度有所降低,但并不是特别明显,因为我们把对第三方协议包的依赖转为对自己编织的协议包的依赖了;代码复杂度大大降低,这是因为我们自己编写的协议包更符合实际使用情况,因而使代码编写难度大大降低,非常容易学习,修改和维护。数据说明了一切。
总结
软件度量最终的目标是要提供统一衡量软件质量的标准,并促使软件质量的不断提高,这项任务被人称为是“寻找圣杯的任务”。但是,无数的科学事实都说明,如果因为目标太难达到就不作任何工作,就不可能有任何进步。在达到最终目标之前的过程中,会有很多有益的
小发现,这些发现又在不断促进新的发现,最后使不可能变成可能。
软件度量科学的发展同样在追求最终目标的过程中为我们带来了众多的有益发现,让我们用更加科学和严谨的态度来看待软件质量问题;让我们对代码的认识从定性描述阶段,进入到定量描述阶段;让我们感受到科学和美学的统一所展现出的巨大魅力。
文章来源于领测软件测试网 https://www.ltesting.net/