2022年软件度量:软件结构度量 .pdf
第四章软件结构度量方法4.1 基础知识早期软件度量学和当时面向功能分解的设计方法相联系,多以模块度量为主。面向过程的程序设计, 影响软件质量的主要因素: 耦合性、内聚性、复杂性、模块化及规模大小。利用软件模块结构图进行分析,可以从以下方面度量:模块间传递数据量的最大值模块间传递数据量的平均值模块间传递数据量的总数模块间公共数据数目模块扇入、扇出平均值和最大值模块条件调用、循环调用数目最大深度(层数)一般认为设计良好的软件产品用其内部结构来描述其特点。软件内部结构属性包括模块性、耦合、内聚、复杂度、信息流、重用度等。如果能够对这些属性进行度量,就能够找出软件中难于实现、测试与维护的部分。4.2 结构度量的类型结构会影响到设计、编码和测试的时间与工作量、维护成本以及复杂性。主要对三类结构进行度量:控制流结构、数据流结构、数据结构。控制流(Control Flow)解决的是各种指令在程序中的执行顺序问题,反映了程序的迭代和循环性质。 程序规模对一条指令只能进行一次计数,而控制流反映出在程序在实际运行时可能会多次执行某条指令。数据流(Data Flow )能够在程序创建或处理某个数据项的过程中对其轨迹进行跟踪。数据流度量描述了数据在与程序进行交互的行为。数据结构 (Data Structure)涉及数据自身的组织问题,与程序无关。如果把数据元素组织成表、 队列、堆栈或者其他具有良好定义的结构,则程序实现时就容易对创建、 修改或删除数据的算法进行良好定义。数据结构能够反映出在编写“用来处理数据” 的程序时的难度以及定义 “用来验证程序正确性” 的测试用例名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 5 页 - - - - - - - - - 时的难度。有些情况下,程序的复杂性是由复杂的数据结构而不是复杂的控制流或数据流结构引起的。4.3 控制流结构控制流度量的建模通常采用有向图(Directed Graph) 。在有向图中,每个结点(或点)所对应的是一条程序语句,每段弧(或有向边)所表示的是从一条语句到另一条语句的控制流。这个有向图是控制流图(Control-flow Graph)或流图( Flow Graph) 。McCabe圈复杂性能够对控制流结构进行度量,有以下三种方法:(1)用程序流图的圈数来测量程序的复杂性。 (需要将程序流图的首尾结点连起来)(2)通过 V(G)= e n +2 计算,其中 e 是程序流图中的边数, n 是程序流图中的结点数。(3)可以通过计算程序中的用于分支与循环判断的判定语句数量。4.4 数据流结构4.4.1 耦合模块内的内聚( Cohesion )与模块间的耦合( Coupling) 。耦合:两个模块之间的相互依赖程度。因此耦合指的是模块对的一个属性,而不是作为一个整体的设计属性。设计中模块的全集表示的是全局耦合(Global Coupling) ,全局耦合可以从可能的模块对中的耦合推导而来。系统中有两个模块x 和 y,两个模块之间可能有6 种耦合关系:(1) 无耦合关系 R0:x 和 y 之间没有任何联系,即x 和 y 完全独立;(2) 数据耦合关系 R1:x 和 y 通过参数产生联系,其中每个参数是一个数据元素或者是一个由不含控制元素的同类数据项的组成的集合。这种类型的耦合对模块之间的任何联系都是必须的;(3) 标记耦合关系 R2:x 和 y 把相同的记录类型当作一个参数。这种类型名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 5 页 - - - - - - - - - 的耦合可以使两个在其他方面不相关的模块相互依赖;(4) 控制耦合关系 R3:x 向 y 传递了一个参数,能够控制y 的行为。即传递的参数是一个标志, 如传递了 1 或 0 的值,用于控制 y 中程序的执行过程;(5) 公共耦合关系 R4:x 和 y 引用相同的全局数据。这种类型的耦合会使得在全局数据格式改变时,必须改变所有公共耦合关系的模块。(6) 内容耦合关系 R5:x 引用到 y 的内部,即 x 的一个分支进入 y,或者改变 y 内的数据,或者修改y 内的某个语句。以上 6 种耦合关系的排列顺序: 顶端的依赖性最弱, 底端的依赖性最强。 所以 i j, 则Ri Rj。i 等于 1或 2, 则认为 x和y之间是一种松散耦合(Loosely Coupled ) 。I 等于 4 或 5,即公共耦合和内容耦合是属于紧耦合(Tightly Coupled) 。用(i, j)表示模块 x 和 y 之间的耦合性,其中i 表示耦合关系 Ri,j 表示给定类型的耦合出现在x 和 y 之间的次数。模块 x 和 y 之间耦合性的度量方法为:c(x, y) = k + n / n+1 k 表示 x 和 y 之间存在的最大的耦合关系Rk, n 是 x和 y 之间的相互连接数。(Fention, Melton. 1990)假设系统 S是由模块 D1, , Dp, , Dq, ,Dn组成,则系统 S的全局耦合度 C的度量方法:C(S) 是集合 c(Dp, Dq): 1pqn 的中位数系统 S的全局耦合度反映了系统中连接性的总体水平。耦合是影响系统设计质量的最重要属性之一。4.4.2 内聚模块内聚时指完成同一任务时对模块各个组成部分的需要程度。7 种内聚:功能内聚:模块完成一个定义良好的功能;顺序内聚:模块完成的功能不止一个, 但这些功能出现的次序是规格说明所规定;通信内聚:模块完成的功能不止一个,但这些功能都位于同一个数据体上;过程内聚:模块完成的功能不止一个,但这些功能只与一个通用过程相关;名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 5 页 - - - - - - - - - 时间内聚:模块完成的功能不止一个,这些功能是在相同的时间内出现的。如:初始化模块。逻辑内聚:模块完成的功能不止一个,但这些功能只在逻辑上相关;巧合内聚:模块完成的功能不止一个,这些功能是不相关的。以上 7 种耦合关系的排列顺序:顶端的内聚最强,底端的内聚最弱。一个系统的内聚程度的度量方法:内聚率 = 具有功能内聚的模块数 /模块总数(Yourdon and Constantine, 1979 )复杂的内聚度量方法(Bieman and Ott, 1994 )4.4.3 信息流模块和系统其他部分之间的信息流,存在于以下情况:(1) 一个模块调用另外一个模块,并且向该模块传递信息;(2) 被调用模块向调用模块返回一个结果。如果被调用模块返回的信息随后被传递给第二个被调用模块,则认为存在局部间接流( local indirect flow) ;如果信息流通过全局数据结构从一个模块传递到另一个模块,则认为存在全局流(global flow) 。模块 M 的扇入( fan-in)等于终止于 M 的局部流数加上M 从中取回信息的数据结构的数目。 模块 M 的扇出(fan-out)等于发源于 M 的局部流数加上M 所更新的数据结构数。Henry和 Kafural把信息流“复杂性”定义为:信息流复杂性( M)= 长度( M)*( (扇入( M)*扇出( M) )2)扇入值、扇出值较低的模块独立于系统,相应的“复杂性”也较低。Shepperd信息流度量方法 : Shepperd复杂性( M) =(扇入( M)*扇出( M) )2 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 5 页 - - - - - - - - - 4.5 数据结构通过对简单的数据类型(如整数类型、字符类型和布尔类型)、复杂数据结构以及在这些数据类型的各种操作对数据结构进行度量。Halstead方法中对操作符、操作数的计算,即是一种数据结构的度量方法。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 5 页 - - - - - - - - -