快捷搜索:

“寻找圣杯的任务”——度量软件之美

“当你能够测度你所说的并将其用数字表达出来,你就对它有了一些懂得;但当你不能测度,不能用数字表达它时,你对它的懂得就很穷困。你在思惟上还远没有进入科学的阶段” ——Load Kelvin

软件质量鉴定碰到的问题

判断和衡量代码质量不停是开拓历程中令人忧?的问题,在同样完成功能的环境下,若何判别一种写法比另一种写法好呢?在代码重构的历程中,若何确定代码质量是在赓续的改进傍边呢?引入一种设计模式今后,代码真的变的比曩昔好了吗?

大年夜部分时刻我们凭感到和履历做这些工作,我们应用很多隐隐的词语来描述我们的判断,比如这样做今后,代码的可掩护性更好,可扩展性前进等等。在越来越重视代码设计的本日,很多人开始应用更感性化,更玄学的词语来形容软件质量,我们会听到评价软件布局很优雅,带来美的享受,以致一些设计原则被提升到了哲学高度,:)。

不得不承认这些词语的描述确凿很相符我们看到一段高质量代码的心境,然则这些新词语的呈现并没有赞助我们办理软件质量鉴定中碰到的问题,由于这些感性的鉴定,因为每小我的履历不合,经历不合,所得出的结论也不尽相同。

软件度量能办理的问题

众所周知,度量对随意率性一个工程产品研制都是很紧张的,度量让人们加倍 懂得产品,可以评价产品,衡量产品德量从而进行改进。对付软件产品也一样,只有定性的评估是不敷的,只有经由过程定量的评估才可以根本的办理评估软件产品德量这样的问题。然而,软件产品的度量却异常艰苦,对它的丈量可能永世无法做到和物理产品一样的完美,然则,软件丈量仍旧具有紧张的意义。

要度量软件质量,首先必要定义软件质量要素,比如,软件的功能性(functionality)、可用性(usability)、靠得住性(reliability)、机能(performance)和支持度(supportability)都衡量软件质量的要素。不过,要真正定量的从技巧上度量这些要素,便是异常艰苦的了。

软件度量事情首先必要确定能够表示软件质量的各类属性和指标;然后,阐发软件,网络数据;接着运用公式换算代码的各类指标值;着末,经由过程这些指标就可以阐发代码的质量。确定哪些属性和指标可以表示软件质量,网络哪些数据,若何用公式推导指标,都是软件度量这门科学的钻研重点。它所确定的各类软件度量指标为我们懂得软件属性,衡量软件质量供给了科学的依据。

软件度量经历了几十年的成长,在软件的各个方面和领域都开拓出了各类度量套件。有针对阐发模型的度量,体系布局设计的度量,构件级设计的度量,界面设计的度量,以及源代码级的度量等等,要懂得这些度量套件若何进行质量丈量可以参考相关的资料。不过,这些度量套件并不是都具备实际的操作意义,有些度量就太繁杂弗成操作,或者离开实际很难理解。然则也有一些度量套件具备很实际的指示意义。本文盘算先容的构件级度量套件和源码级度量套件都是很故意义的。

软件度量可以赞助我们理解软件属性,衡量软件质量,然则,软件度量并没有真正的去丈量软件质量,而是丈量软件质量的体现,是以,仍旧必要我们去阐发确定所丈量的指标和软件质量的准确关系。

构件级和源码级的度量

构件级的软件度量集中评价软件构件的特点,它主要包括3C丈量,既:内聚度(coheion),耦合度(coupling),和繁杂度(complexity),这组丈量指标贴切的描述了构件设计质量,我们也能看出各类设计模式和设计原则都在设法主见子平衡这些元素。

内聚度和耦合度可以经由过程考察构件的输入,输出参数的性子和个数,全局变量,被调用模块的个数(扇出),调用的外部模块数(扇入),得出丈量数据。阐发公式就不枚举在这里了,公式的大年夜概含义是假如一个模块有少的输入参数,且都是数据型的参数,没有造访全局数据,被单一的模块调用,可以估计这个模块将有低的耦合度。关于繁杂度还有一个闻名的丈量指标——环繁杂度,它基于构件节制流图进行阐发。

源码级的软件度量主要评价代码繁杂度,Halstead丈量套件被称为“最闻名和钻研最完全的软件繁杂度复合度量之一”。它经由过程钻研源代码中的操作符和操作数,开拓出了一系列指标,可以描述代码的实际体积,开拓事情量,开拓光阴,以致软件中被猜测的差错数。 很多软件丈量对象都供给象耦合度,环繁杂度,Halstead丈量套件,扇入扇出数,等指标的自动统计,透过这些指标,我们可以掌握代码的内部特点,阐发每次代码篡改对代码质量的影响。一些停顿在定性描述上的质量改进,完全可以经由过程数据获得印证。比如某部分代码采纳设计模式今后前进了内聚力,低落了耦合度,某块职责浩繁,分外繁杂的代码被拆散,所拆出的各个模块的繁杂度都很低,易于掩护。那么经由过程度量数据必然可以反映出这些特点,比如,源码级的繁杂度指标低落,构件级的耦合度指标低落等等。

代码实践

下图展示了两段相同功能的代码,在重构前后的布局示意图。

ProfileConf直接应用了第三方SNMP协议包,而ProfileConfNew则应用了封装后的SNMP协议软件包。进行协议封装的目的一是为了隔离第三方软件包,另一个目的是为了简化客户端应用SNMP协议栈的操作。改造完成后,我们应用Together自带的软件丈量对象进行了数据丈量。选择Together菜单中tools——>metrics,里面供给了大年夜量的丈量指标。

我们选择了几个对照关注的指标,对新旧代码进行了丈量,下面是丈量结果。

下表对丈量指标做简单阐明。

经由过程数据可以看出,改进今后,编写的代码有所削减,大年夜约节省三分之一的代码;耦合度有所低落,但并不是分外显着,由于我们把对第三方协议包的依附转为对自己编织的协议包的依附了;代码繁杂度大年夜大年夜低落,这是由于我们自己编写的协议包更相符实际应用环境,因而使代码编写难度大年夜大年夜低落,异常轻易进修,改动和掩护。数据阐清楚明了统统。

总结

软件度量终极的目标是要供给统一衡量软件质量的标准,并匆匆使软件质量的赓续前进,这项义务被人称为是“探求圣杯的义务”。然则,无数的科学事实都阐明,假如由于目标太难达到就不作任何事情,就弗成能有任何进步。在达到终纵目标之前的历程中,会有很多有益的小发明,这些发明又在赓续匆匆进新的发明,着末使弗成能变成可能。

软件度量科学的成长同样在追求终纵目标的历程中为我们带来了浩繁的有益发明,让我们用加倍科学和严谨的立场来看待软件质量问题;让我们对代码的熟识从定性描述阶段,进入到定量描述阶段;让我们感想熏染到科学和美学的统一所展现出的伟大年夜魅力。

您可能还会对下面的文章感兴趣: