计算复杂性的度量标准【基于投影寻踪的Web软件复杂性度量】

  摘 要:传统的软件复杂性度量方法主要是针对C/�C++�、Ada等语言开发的非Web应用。以面向对象的基于Struts框架的Web软件为研究对象,提出了适合于Web�Struts软件的3个方面的复杂性度量指标,并提出了一种基于带交叉算子人工鱼群和投影寻踪(PP)算法的Web应用软件复杂性度量方法。把Web软件多个复杂性度量指标综合成一维综合投影值,利用样本数据求解最佳投影方向,确定评价等级的综合投影值区间,根据测试样本综合投影值与区间值比较,获得综合评价结果。实例评价结果表明,所提方法具有较强的适用性和应用性。
  关键词:软件复杂性度量;面向对象;Struts框架;投影寻踪;交叉算子;人工鱼群算法
  中图分类号: TP311 文献标志码:A
  �
  Web software complexity metrics based on projection pursuit
  �
  ZENG Yi, HU Xiao�wei���*�, LI Juan
  �(
  College of Computer Science, Chongqing University, Chongqing 400044, China
  )�
  Abstract:
  Web software complexity metrics does play a very important role in the software development. The traditional software complexity metrics method mainly targets on the non�Web applications which use language like C/�C++� and Ada. This paper took object�oriented Web software based on Struts framework as research subject and put forward three complexity metrics suitable for the Web�Struts software. Besides, this paper also proposed a method for computing Web software complexity metrics based on Artificial Fish Swarm Algorithm (AFSA) with cross operator and Projection Pursuit (PP) algorithm. After integrating multiple complexity metrics into one�dimension comprehensive projection value, the optimized projection direction could be acquired through sample data. Then the comprehensive projection value of evaluation grades could also be determined. According to the comparison between the comprehensive projection values of the testing samples and the interval of level, the comprehensive metrics result could be finally obtained. The example evaluation results prove the feasibility and effectiveness of the proposed method.
  �Key words:
  software complexity metric;object�oriented;Struts frame;Projection Pursuit (PP);cross operator; Artificial Fish Swarm Algorithm (AFSA)
  �
  
  0 引言�
  软件复杂性度量在软件开发中起着非常重要的作用,它可减少整个开发周期的费用,度量软件产品的可理解性,与软件的可靠性、可维护性等质量因素密切相关。围绕着软件复杂性,产生了很多的软件复杂性度量方法,传统的度量方法有代码行��[1]�、环形复杂性��[2]�、Halstead的软件科学理论��[3]�等,面向对象的度量方法有CK度量��[4]�、MOOD度量��[5]�等,而且也出现了一些度量软件复杂性的工具,如国外的Shimba和Jstyle是两款针对Java语言的度量工具,基于Eclipse平台的Java度量工具――JMT��[6]�等。�
  但是,以上的研究仍然存在着诸多的不足。例如度量粒度不够细,度量过于粗糙;考虑得不够全面,缺乏严密性以及不能度量在特定开发平台设计出的软件的复杂性等。总的看来,现阶段针对面向对象软件复杂性的度量还不多,已有的度量方法和度量的工具主要是针对结构化程序或C/�C++�、Ada等语言开发的非Web应用,缺乏对基于某种特定的软件开发平台或编程语言开发的软件复杂性度量的方法。近年来,采用Struts框架开发的Web应用软件逐渐增多,此类软件的大部分的业务逻辑是通过配置文件以及模块与页面之间的跳转来实现的,仅使用传统的度量指标不能准确地表征整个软件的复杂程度。因此,本文的工作是以基于Struts框架的Web应用软件为研究对象,提出了一组适用于此类软件的复杂性度量指标。目前用于软件度量的模型和方法也很多,但针对Web�Struts软件还没有一套完整的行之有效的方法,为此本文提出了一种利用投影寻踪��[7]�(Projection Pursuit, PP)模型和人工鱼群算法(Artificial Fish Swarm Algorithm, AFSA)的Web�Struts软件复杂性度量方法。通过该方法能够指导软件设计人员改善基于Struts框架开发的Web软件复杂性,提高此类软件质量。�
  1 投影寻踪方法和人工鱼群算法原理�
  1.1 投影寻踪方法原理�
  PP方法是处理和分析高维数据的一种探索性数据分析的新兴统计方法。其基本思想是把高维数据按照一定的方向投影到低维(1~3维)子空间上,以投影指标函数来衡量投影所反映出的原始数据结构特征,并从不同投影中寻找出使投影指标函数达到最优的投影值,再根据该投影值与研究系统的输出值之间的数据关系构造数学模型。�
  投影寻踪法的基本思想是利用计算机技术,通过某种组合把高维数据投影到低维子空间上,并通过极大化或者极小化投影指标,从而寻找出最能反映出高维数据结构特征的投影方向,在低维空间再对数据结构进行分析,以达到能够分析和研究高维数据的目的。�
  1.2 人工鱼群算法�
  人工鱼群算法的基本思想是��[8]�:在一片水域中,鱼生存数目最多的地方一般就是本水域中富含营养物质最多的地方,依据这一特点来模仿鱼群的觅食、聚群和追尾行为,从而实现全局寻优。��
  人工鱼个体的状态可表示为向量F=(x�1,x�2,…,x�n),其中x�i(i=1,2,…,n)为欲寻优的变量;人工鱼当前所在位置的食物浓度表示为Y=f(x)。其中:Y为目标函数值;人工鱼个体之间的距离表示为d��i, j�=‖F�i-F�j‖;V表示人工鱼的感知距离;Step表示人工鱼移动的最大步长;δ为拥挤度因子;N表示参与寻优的人工鱼数目,即群体规模。则可将鱼群行为做如下描述��[9-10]�:�
  1)觅食行为�Fish_prey()。�设人工鱼当前状态为X�i,在其感知范围内随机选择一个状态X�j,如果在求极大问题中Y�iY�j),则向该方向前进一步;反之,再重新随机选择状态X�j,判断是否满足前进条件。这样反复尝试Try_number(根据收敛速度调整值大小)次后,如果仍不满足前进条件,则随机移动一步。�
  2)聚群行为�Fish_swarm()。�设人工鱼当前状态为X�i,探索当前领域内(即d��i, j�δY�i,表明伙伴中心有较多的食物并且不太拥挤,则朝伙伴的中心位置方向前进一步;否则,执行觅食行为。�
  3)追尾行为�Fish_follow()。�设人工鱼当前状态为X�i,探索当前领域内(即d��i, j�δY�i,�表明伙伴X�j的状态有较高的食物浓度并且不太拥挤,则朝伙伴X�j方向前进一步;否则,执行觅食行为。�
  4)公告板。公告板是记录最优人工鱼个体状态的地方。当整个算法的迭代结束后,输出公告板的值,即为所求的最优值。�
  1.3 去交叉局部优化策略�
  根据文献[9]可以判断两个路径是否交叉的原理。去交叉原理的算法实施过程如下:�
  设平面有A、B、C、D 4个顶点。从起始节点开始沿原有路径向后逐个遍历节点,直到遇到A点,连接A点至C点,随后将BC之间路径的方向反向,并将B点连接到D点,然后向下沿原有顺序遍历直至到达终止节点,从而消除交叉路径。�
  1.4 带交叉算子的人工鱼群算法��
  通过引入遗传算法的交叉机制,实现了对鱼群中人工鱼个体的跳变,从而调整优化了群体,在提高AFSA收敛速度的同时保证了全局搜索能力。��
  1.5 带交叉算子人工鱼群算法实现步骤�
  实现步骤如下:�
  第1步 初始化鱼群。对人工鱼群算法中的各个参数进行设定:种群规模为N,可视域为V,移动步长为Step,拥挤因子为δ,尝试次数为Try_number,连续不变化次数的最大阈值为Maxstep。�
  第2步 初始化公告板。根据初始化鱼群中的每条人工鱼的当前状态,计算初始鱼群中每条人工鱼所在位置的食物浓度,然后进行大小比较,取食物浓度最高的人工鱼的状态及其食物浓度值(计算机投影目标函数值为Q(a))赋给公告板。�
  第3步 行为选择。每条人工鱼个体分别模拟追尾行为和聚群行为,通过比较食物浓度函数的值来选择最佳的行为来执行,缺省的行为为觅食行为。�
  第4步 更新公告板。每条人工鱼迭代完一次后,就把自身的食物浓度函数的值与公告板的值进行比较,如果大于公告板上的值则更新公告板;反之,公告板的值不变。�
  第5步 交叉条件判断。判断Try_number是否达到Maxstep。若是执行第6步;否则执行第7步。�
  第6步 交叉操作。对鱼群内除公告板中最优个体外其他所有人工鱼群执行如下操作:�
  1)对各人工鱼群进行遗传交叉操作;�
  2)对新形成的鱼群计算各人工鱼的值,并与公告板中最优值进行比较,如果优于公告板,则自身取代之。�
  第7步 终止条件判断。不断地重复第3~4步,当迭代次数达到最大值时或者公告板上的最优解达到了满意的误差界内时,该算法结束,最后输出公告板上最优解,即最佳投影方向a�*和最佳投影指标函数Q(a)的值。��
  
  
  
  2 软件复杂性度量指标�
  软件复杂性度量工作中的度量指标的选取主要是依赖于度量人员的工作经验。目前对软件复杂性度量的研究主要是针对面向对象或面向过程的传统软件。本文以基于Struts框架的Web软件为研究对象,通过分析这类软件产品与传统软件产品不同的特点,提出了一组新的Web�Struts度量指标来更好地表征这类软件的复杂度。同时也选取了一些传统的度量指标,和新的度量指标共同组成度量指标集合来度量此类软件产品的复杂性。�
  
  2.1 通用度量指标�
  这一组度量指标最初主要是针对用面向过程技术开发的软件产品提出来的,如C等。这组度量指标现在也通常用来度量用面向对象语言(如�C++�、Java等)设计的软件产品的复杂性。它们能够表征Web软件组件内的代码的复杂度。�
  1)代码行(Lines Of Code, LOC);�
  2)McCabe复杂度(Cyclomatic Complexity, CC);�
  3)注释比例(Comment Ratio, CR)。�
  2.2 面向对象度量指标�
  选取的这一组面向对象的度量指标主要是针对面向对象开发语言(如�C++�、Java等)的新特点而提出来的,它们能很好地表征用面向对象语言编写的程序代码的特征。这一组��[4-5]�度量指标也是用来表征Web软件组件内的代码的复杂度的,主要参考了CK度量组:�
  1)每类加权方法数(Weighted Methods per Class, WMC);�
  2)每个类的孩子数(Number Of Children, NOC);�
  3)继承树的深度(Depth of Inheritance Tree, DIT);�
  4)对象类之间耦合度(Coupling Between Object classes, CBO);�
  5)类响应(Response For Class, RFC);�
  6)方法重写的数目(Number Of Overridden Methods, NOOM)。�
  2.3 新的Web�Struts度量指标�
  本文通过分析基于Struts框架的Web应用软件的结构特点,提出了一组新的Web�Struts度量指标。该组度量指标能够覆盖基于Struts框架开发的Web软件中分散的业务逻辑和数据,这组度量指标��[11]�包括:�
  1)JSP页面超链接数量(Number of JSP Links, NJL),表示模块中所有页面的JSP超链接总数。�
  2)JSP数量(Number Of JSP, NOJ),表示模块中JSP文件的数量。�
  3)Action数量(Number Of Action, NOA),表示模块中可以单独访问的继承自Action类的业务逻辑单元数量。�
  4)FormBean数量(Number Of FormBean, NOFB),表示模块中使用的继承自FormBean类的业务数据单元的数量。�
  5)单个业务逻辑单元的最大跳转数MaxForward(表1中表示为MAXF1)。�
  6)指向单个URL的最大跳转数MaxForward2(表1表示为MAXF2)。
  �
  
  7)内置对象调用次数(Number Of Built�in Objects, NOBO)。�
  
  把3个通用度量指标,6个面向对象度量指标以及7个新的Web�Struts度量指标共同组成一个度量指标体系,这个整体度量指标体系是适用于基于Struts框架的Web应用软件的,一共16个度量指标,整体指标体系如图1所示。�
  3 软件复杂性度量模型的构造�
  本文采用投影寻踪的方法��[7]�,与Web�Struts软件复杂性度量相结合,构建Web�Struts软件复杂性度量的投影寻踪模型,并将该方法成功用于Web�Struts软件复杂性综合度量中。其具体步骤如下。�
  1)根据所选取的度量指标,计算出16个度量指标的值。本文利用Eclipse的一个度量Java源代码的插件包edu.pku.sei.metric_1.4.2.jar获得通用度量指标和面向对象的度量指标的值。�
  2)数据样本归一化处理。�
  为了消除各度量指标间的量纲不统一和统一度量指标值的变化范围,需要对软件复杂性度量样本的各指标值进行线性归一化处理,把各度量指标值归一到0~1,度量指标值越小表示该度量样本的复杂性越低。�
  设Web�Struts软件复杂性度量中各指标值得样本集为:�
  
  �{Χ�*(i, j)|i=1,2,…,n; j=1,2,…,m}�
  其中:n为样本的个数,m为度量指标的个数,Χ�*(i, j)表示第i个度量样本的第j个软件复杂性度量指标值。数据样本归一化处理公式表示如下:�
  Χ(i, j)=(Χ���max��(j)-Χ�*(i, j))/(Χ���max��(j)-Χ���min��(j))(1)�
  其中:Χ���max��(j)和Χ���min��(j)分别为第j个度量指标的最大值和最小值,Χ(i, j)为度量样本归一化处理后的指标值。�
  3)构造投影指标函数。�
  指把m维数据综合成某一方向的一维投影值,并要求投影值散布特征为局部投影点尽可能密集,整体上各个点团之间尽可能散开。�
  用m维的单位向量a(a�1,a�2,…,a�m)表示某一投影方向,a(j)为复杂性度量第j个度量元的投影方向,则第i个样本数据综合各度量元投影方向后的一维投影值Z(i),如式(2)所示:�
  Z(i)=∑mj=1a(j)X(i, j); i=1,2,…,n; j=1,2,…,m(2)�
  其中:n为样本的个数;m为指标数(即度量元的个数),m=16;X(i, j)为归一化处理后的样本数据指标值。�
  设S(a)为投影值Z(i)的标准差,D(a)为投影值Z(i)的局部密度,则投影指标函数Q(a)可以表示为:�

推荐访问:寻踪 复杂性 度量 投影