基于面向对象程序切片的软件度量
1 引言
程序切片是软件工程领域的一项程序分析技术,在软件测试、度量、程序调试、维护以及逆向工程等方面有着广泛应用。通过切片技术,人们在程序分析过程中可以重点关注那些感兴趣的代码或者变量。
2 程序切片技术
这里利用面向对象程序切片技术进行软件度量。程序切片主要包括:
(1)语句切片该传统的程序切片技术是一种条件切片,根据程序的顺序、循环和选择结构进行程序切片。
(2)无定型程序切片 其不仅在保存一个程序语义投影的同时简化了程序,还可以使用任何简化的转换。而这些转换保留了该语义映射。
(3)面向对象切片 把切片技术应用于面向对象的系统相关图和过程相关图中,使对面向对象程序的代码理解、测试、调试、逆向工程和度量分析变得相对容易嘲。
3 面向对象程序切片技术
程序切片技术分面向过程和面向对象程序切片。目前程序切片大都以系统依赖图为基础,利用图的可达性算法获得。
3.1 sdg和oosdg
系统依赖图sdg(system dependence graph)用一组边和顶点的集合表示一个程序。顶点表示程序的语句和控制谓词,边则表示语句之间的依赖关系。在sdg中有两类边:控制依赖边和数据依赖边。sdg是在控制流图、数据流图、控制依赖子图、数据依赖子图、过程依赖子图和程序依赖图的基础上建立的一种语法分析树,如图1所示。
面向对象依赖图oosdg(obiect-orientecl system depen-dence graph)是过程依赖子图、类依赖子图、类层次子图、控制依赖子图、数据依赖子图和虚函数调用子图几种表示方法的并集.如图2所示。
3.2 软件度量技术的研究
软件度量是一个在近几十年研究非常活跃的软件工程领域。抽象来讲,它是一个函数,其输入是软件,输出是单一的数值,能解释软件所具有的一个给定属性对软件质量的影响。用于预测、评估和控制软件开发的过程,促进项目的成功,开发出高质量的产品。
软件度量主要包括复杂性度量、模块性度量、易修改性度量、易移植性度量、可扩充性度量、可靠性度量、易维护性度量、测试充分性度量等。有些可以用数值表示,称为“定量度量”;不能用单一数值表达的称为“定性度量”。研究集中在定量度量方面的内聚度和耦合度的度量,这两个方面是衡量软件质量非常重要的标准。二者之间密切相关,模块之间的强耦合通常意味着弱内聚,而模块之间的强内聚则意味着弱耦合。
4 利用程序切片技术进行软件度量
软件开发的目标是开发出高内聚和低耦合的系统。这里研究利用切片技术度量面向对象程序的内聚度和耦合度,尤其是内聚度量。
4.1 耦合度量
耦合度(coupling degree)用来测量由两个或多个模块连接而引起的联结程度的强弱。强耦合使模块连接后的系统变得复杂。因为模块之间具有高度的关联,改写模块将十分困难。降低模块间的耦合则可以减少系统的复杂性。因此,在系统设计中应追求尽可能松散的耦合关系。
4.2 内聚度量
内聚度(cohesion degree)是软件的内在属性,反映软件设计和实现中模块组件之间结合的紧密程度。高内聚的软件模块有着最基本的功能,很难再切割其规模。
面向对象程序的基本特征是类。类由属性和方法组成,属性和方法间存在3种关系,因此类内聚度也从3个方面度量:属性问内聚度、方法与属性问内聚度、方法问内聚度。设类c共有n个属性,m个方法,其中m,n≥0。v_union表示所有成员变量。m_union表示所有成员方法。这里使用数据标记(data token)而非语句作为基本单元来修正切片这个概念。数据切片包含和切片变量存在依赖关系的数据集合,简写作dataslice(l,v),其中l表示程序中的某个点,通常情况下特指某条语句:v表示在l定义或使用的变量的集合;#表示势操作,表示集合中元素的个数。则属性间内聚度、方法与属性间内聚度和方法间内聚度的计算公式分别为式(1)~(3),如下所示:
4.3 实验操作
采用目前最主流的程序切片技术,以系统依赖图为基础,利用图的可达性算法获得切片结果。然后利用将切片结果代入式(1)~(3)进行计算,得到内聚度。
以下面的程序为例进行切片,计算内聚度,并和基于依赖性分析的类内聚度度量方法相对比。
程序切片的概念是在考虑各个方法、变量之间的依赖关系并在依赖图的基础上构造的。举一个简单的c++程序对上述公式进行应用,程序如下:
所定义的类是cuboid,它有5个变量,2种方法,v_uion={a,b,c,a,v},m_uion={area,volume }。
构造面向对象依赖图,利用可达算法得到数据切片如下:
利用式(1)~(3)进行度量计算,具体过程如下:
(1)内聚度量值是一个3元组,分从属性之间、方法之间、属性和方法之间3个层面进行内聚度量;
(2)datasliee(l,a)∩v_uion={a};同样,datasliee(l,b)∩v_uion={b},dataslice(l,c)∩v_uion={c},进行势操作后取值均为1:
(3)datasliee(l,v)∩v_uion={a,b,c},dataslice(l,a)∩v_uion={a,b,c},进行势操作后取值均为3;
(4)datasliee(l,a)∩dataslice(l,v)={a,b,c},进行势操作后取值为3;
(5)根据式(4)计算得到:cohesion(v_v)=(1+1+3+3)/4×5=2x5;
(6)dataslie(l,area)∩m_uion={area};同样,datasliee(l,volume)∩m_uion={volume},进行势操作后取值均为1。
计算得出cohesion(m_m)=(1+1)/2x1=1。两个方法之间不存在调用、继承等关系,它们是独立的,所以内聚度为1;dataslice(l,area)∩dataslice(l,volume)∩m_uion进行势操作后取值均为1。
计算得出cohesion(m_v)=1/5。所以cuboid的内聚度为一个3元组cohesion(cuboid)={cohesion(v_v),cohesion(m_m),cohesion(m_v)}={2/5,1,1/5}。
5 结束语
利用程序切片技术,将度量粒度缩小到语句级别。而这里的度量粒度更是小到变量级别,在更小的级别上进行度量。基于程序切片的软件内聚度和耦合度度量从软件的基本粒度一变量出发,跳跃了面向过程和面向对象程序的区别,就其度量方法和公式考虑是没有局限性的,是普适的。
一个优良的内聚度度量准则应满足briand的4个性质,即非负性及标准化、最小值和最大值、单调性、模块合并后内聚度不会增大。后续工作就是证明基于面向对象程序切片的内聚度度量方法符合brland的4个性质。
北京大学在多维度单细胞质谱流式分析领域取得重要进展
iphone15颜色有几种
新加坡仍然是区块链和加密货币领域监管最宽松的商业环境之一
红米Note 5详细数据报告
iPhone8销量遇冷、iPhoneX供货不足,苹果遭遇市场危机何去何从?
基于面向对象程序切片的软件度量
对话Moka李国兴:大模型改造SaaS需要持续渐进式创新,先发者把握先机
配电网的特点 配电网的特点
工业交换机的设置步骤,您知道吗?
苹果全新的iPad Pro信息曝光 能否继续辉煌?已经开始量产但发售要推迟
红米k40游戏版值得买吗?红米k40游戏版参数和配置分析
苹果iPhone制造业务不会轻易搬离中国 其它产品难说
微软凭什么赢得美国陆军的订单?这个订单于AR产业有什么启示意义?
基石数据:TOC-数字化实施-珠海篇(十八)
荣耀V40的设计草图以及高清渲染图曝光
2021年实现自动驾驶商用 安全既是天使也是魔鬼
编码器接错线会如何,编码器如何更换,编码器更换注意事项
英文版智慧教室融合管理平台来啦!
三星发布M7智能电视一体机 电视、电脑显示器相结合
夏利、奇瑞们陷十面埋伏 单纯布局新能源汽车市场并不是出路