400 likes | 549 Vues
软 件 工 程. 第 19 章 软件的技术度量. 第 19 章 软件的技术度量. 19.1 软件质量 19.2 软件技术度量框架 19.3 分析模型的度量 19.4 设计模型的度量 19.5 源代码度量 19.6 对测试的度量 19.7 对维护的度量 19.8 小结. 19.1 软件质量. 三个重点: 1. 软件需求是质量测度的基础。 2. 特定的标准定义了一套开发标准,用以指导软件开发的方式。 3. 要有一套经常未被提及的隐式需求 ( 例如,对好的可维护性的期望 ) 。. 19.1.1 McCall 的质量因素.
E N D
软 件 工 程 第19章软件的技术度量
第19章软件的技术度量 19.1 软件质量 19.2 软件技术度量框架 19.3 分析模型的度量 19.4 设计模型的度量 19.5 源代码度量 19.6 对测试的度量 19.7 对维护的度量 19.8 小结
19.1 软件质量 三个重点: 1.软件需求是质量测度的基础。 2.特定的标准定义了一套开发标准,用以指导软件开发的方式。 3.要有一套经常未被提及的隐式需求(例如,对好的可维护性的期望)。
19.1.1 McCall的质量因素 影响软件质量的因素可以分为两大类: (1)可以直接测度的因素(例如,每个功能点 的错误) (2)只能间接测度的因素(例如,可用性和可 维护性)
软件质量因素在软件产品的三个方面: • 操作特性 • 承受改变的能力 • 对新环境的适应能力
质量的因素: • 正确性 • 可靠性 • 功效 • 完整性 • 可用性 • 可维护性 • 灵活性 • 可测试性 • 可移植性 • 可复用性 • 互操作性
可维护性 灵活性 可测试性 可移植性 可复用性 互操作性 产品修订 产品变迁 产品运行 正确性 可靠性 可用性 完整性 效率 McCall的软件质量因素
定义一组度量,并被用于按照下面的关系为每个因素开发表达式:定义一组度量,并被用于按照下面的关系为每个因素开发表达式: Fq=c1×m1+c2×m2+…+cn×mn Fq是一个软件质量因素 cn是回归系数 mn是影响质量因素的度量值
19.1.2 FURPS 考虑软件质量的因素,简称为FURPS: • 功能性(functionality) • 可用性(usability) • 可靠性(reliability) • 性能(performance) • 支持度(supportability)
FURPS五个主要因素的评估方式: • 功能性 • 可用性 • 可靠性 • 性能 • 支持度
19.1.3 ISO 9126质量因素 6个关键质量属性: • 功能性 • 可靠性 • 可用性 • 效率 • 可维护性 • 可移植性
19.2 软件技术度量框架 • 19.2.2 测度原则 • 五个活动为特征: • 公式化 • 收集 • 分析 • 解释 • 反馈
19. 2. 3 有效软件度量的属性 有效软件度量包含的属性: • 简单的和可计算的 • 经验和直觉上有说服力 • 一致的和客观的 • 在其单位和量纲的使用上是一致的 • 编程语言独立的 • 高质量反馈的有效机制
19. 3 分析模型的度量 功能点(FP)度量(第4章)可以用来作为预测从 分析模型得到的系统大小的手段。 19.3.2 bang度量 • 象功能点度量一样,bang度量可以由分析模型得到对将要实现的软件的大小的指示。 • 为了独立计算bang,软件工程师必须首先评价一组原语——在分析层次不能再划分了的分析模型的元素。
原语是通过评价分析模型和开发以下项的计数来决定的:原语是通过评价分析模型和开发以下项的计数来决定的: • 功能原语(FuP) • 数据元素(DE) • 对象(OB) • 关系(RE) • 状态(ST) • 变迁(TR)
除了上述的六个原语,另外如下的计数也需确定:除了上述的六个原语,另外如下的计数也需确定: • 修改的手工功能原语(FuPM) • 输入数据元素(DEI) • 输出数据元素(DEO) • 存储数据元素(DER) • 数据记号(TCi)
RE/FuP<0.7意味着一个功能很强型应用程序 • 0.8<RE/FuP<1.4意味着混合型应用程序 • RE/FuP>1.5意味着数据复杂型应用程序
因为不同的分析模型将模型分成或大或小的细化程度,一个对每个原语的平均记号计数:因为不同的分析模型将模型分成或大或小的细化程度,一个对每个原语的平均记号计数: TCavg=ΣTCi/FuP • 它被用来控制在某应用程序领域中跨越很多不同模型划分的一致性。
为了计算功能很强型应用软件的“撞击值”,可以用以下算法:为了计算功能很强型应用软件的“撞击值”,可以用以下算法: set initial value of bang=0; do while functional primitives remain to be evaluated compute token-count around the boundary of primitive i; compute corrected FuP increment(CFuPI); Allocate primitive to class; Assess class and note assessed weight; Multiply CFuPI by the assessed weight; bang=bang+weighted CFuPI; enddo
为了计算数据强型应用程序,可以用以下算法:为了计算数据强型应用程序,可以用以下算法: set initial value of bang=0; do while objects remain to be evaluated in the data model compute count of relationships for object i; compute corrected OB increment(COBI); bang=bang+COBI; enddo
19.3.3 规约质量的度量 评价分析模型和相应的需求规约质量的特征: • 明确性(无二义性) • 完全性 • 正确性 • 可理解性 • 可验证性 • 内部和外部一致性 • 可完成性 • 简洁性 • 可追踪性 • 可修改性 • 精确性 • 可复用性
19.4 设计模型的度量 19.4.1 体系结构设计度量 三个软件设计复杂度测度: • 结构复杂度 • 数据复杂度 • 系统复杂度
一个模块i的结构复杂度,S(i): S(i)=f²out(i) 其中fout(i)是模块i的扇出
数据复杂度,D(i),提供了一个模块i的内 部接口的复杂度的指示: D(i)=v(i)/[fout(i)+1] 其中V(i)是传入传出模块i的输入输出变量的个数。
系统复杂度,C(i),定义为结构复杂度和数据复杂系统复杂度,C(i),定义为结构复杂度和数据复杂 度的总和 C(i)=S(i)+D(i) 复杂性度量: HKM=length(i)×[fin(i)+fout(i)]² 其中length(i) 是在模块i中编程语言语句的数目, fin(i) 是模块i的扇入。
19.4.2 构件级设计度量 构件级设计度量集中于软件的内部特性 且包括“三个C”的测度: • 模块内聚(cohesion) • 耦合(coupling) • 复杂度的度量(complexity)
内聚度量定义: • 数据切片 • 数据记号 • 胶合记号 • 超胶合记号 • 粘度
强功能内聚(SFC) • 弱功能内聚(WFC) SFC(i)=SG(SA(i))/tokens(i) • 其中SG(SA(i))指超胶合记号——位于一个模块i的所有数据片的数据记号集合。当超胶合表征比上模块i中的所有的记号的总和上升到最大值1的时候,模块的功能内聚也增加。
19.4.2.2 耦合度量 对数据和控制流耦合: • di=输入数据参数的个数 • ci=输入控制参数的个数 • do=输出数据参数的个数 • co=输出控制参数的个数
对全局耦合: • gd=用作数据的全局变量的个数 • gc=用作控制的全局变量的个数
对环境耦合: • w=被调用模块的个数(扇出) • r=调用所考虑的模块的模块数(扇入) • 使用这些度量,一个模块耦合指示器,mc,以下面方式定义: mc=k/M 其中k=1,一个比例常数,而且 M=di+a×ci+do+b×co+gd+c×gc+w+r 其中a=b=c=2 • mc的值越高,整体模块耦合越低 • 一个改进的耦合度量:C=1-mc 其中耦合度在最小值0.66到接近1的最大值之间非线性上升。
19.4.3 界面设计度量 • 开销=∑[变迁频率(k)×变迁开销(k)] 其中k是当一个特定任务完成时,从一个布局实体到下一个实体的特定变迁 • 对完成某应用功能所需的一个特定任务或任务集的所有变迁形成一个总和。开销可以用时间、处理延迟、或其他合理的值,例如一个鼠标在布局实体之间移动的距离,来标识。
布局恰当性定义成: • LA=100×[(LA开销-最优布局)/(提出的布局开销)] 其中对于一个最优布局LA=100。
为了计算GUI的最优布局,界面区域(屏幕的区域)被分成方格,每个方格代表着一个布局实体可能的位置。对于一个有N个可能位置的且放置K个不同的布局实体的方格,可能的布局数以下面方式给出[SEA93]:为了计算GUI的最优布局,界面区域(屏幕的区域)被分成方格,每个方格代表着一个布局实体可能的位置。对于一个有N个可能位置的且放置K个不同的布局实体的方格,可能的布局数以下面方式给出[SEA93]: • 可能的布局数=[N!/(K!×(N-K)!)]×K! • 当布局位置数上升,可能的布局数增长得十分大。 • 为发现一个最优布局,可采用树搜索算法。
19.5 源代码度量 • n1——在一个程序中出现的不同操作符 • n2——在一个程序中出现的不同操作数 • N1——操作符出现的总数 • N2——操作数出现的总数
Halstead展示了长度N可以这样来估计: N=n1log2n1+n2log2n2 • 程序体积可以如下定义: V=Nlog2(n1+n2) • 以基本测度而言,体积比率可以写成: L=2/n1×n2/N2
19.6 对测试的度量 • 使用程序体积的定义V • 程序层次PL • 软件科学工作量e: PL=1/[(n1/2)×(N2/n2)] e=V/PL • 将被分配给模块k的整体测试工作量百分比: 测试工作量百分比(k)=e(k)/Σe(i)
19.7 对维护的度量 软件成熟度指标(SMI): • MT=当前发布中的模块数 • Fc=当前发布中已经变更的模块数 • Fa=当前发布中已经增加的模块数 • Fd=当前发布中已删除的前一发布中的模块数
软件成熟度指标以下面的方式计算: SMI=[MT-(Fa+Fc+Fd)]/MT • 当SMI接近1.0的时候,产品开始稳定
19.8 小结 • 软件度量提供了一个定量的方法来评价产品内部属性的质量,因此可以使得软件工程师能够在产品完成之前进行质量评估。度量提供了创建有效的分析和设计模型、可靠的代码、和完全的测试必需的洞察。