软件工程-第15章
例:下图是ATM系统的部分类视图,对该系统进行类的
耦合的计算。
类
耦合类
CBO
ATM
BankServer,BankAccount,Transaction
3
BanServer
ATM,BankAccount,Transaction
3
BankAccount
ATM,BankServer,Transaction
支持类的数量 每个关键类的平均支持类数量
子系统的数量
15.4 面向类的度量
经过近年来的研究,人们已经根据面向对象
系统的特点提出了一系列面向对象度量,有 的得到了广泛的认可和应用。这些度量分别 从面向对象系统本身和系统中单个类的角度 进行度量.其中较有名的有C&K度量集和 Mood度量集。
15.1 OO度量的识别特征
任何产品的技术量度都取决于产品的特性。OO软件与 使用传统方法开发的软件的度量方法截然不同,Berard 定义了OO软件的5个特征:
15.1.1 局部化
局部化指信息被集中在一个程序内的方式。 传统方法中:数据与过程分离、功能分解,实现了功能局部 化。传统软件工程使用数据驱动功能,其度量着重放在模块 内部结构或复杂性(如模块规模、内聚性、环复杂度等)或 模块间相互连接的方式(如模块耦合)上。 在OO系统中,类是OO系统的基本单位,对象封装数据和过 程,所以局部化是基于对象的,因此,要把类(对象)作为 一个完整实体进行度量。而且,操作和类之间的关联不一定 是“一对一”的,所以,类合作的度量必须能适应“一对多” 或“多对多”的关联。
例:下图是ATM系统的部分类视图,对该系统进行类的
加权方法计算(假定方法的复杂度都为1)。
类名 Transaction TransferAccount Withdraw Inquiry
方法 2 3 1 1
WMC=7/4=1.75方法/类
继承树的深度(DIT):
DIT指从结点到根的最大长度,即对象所属类在继承树中
果CS的值比较高,说明一个类有很多功能,这就会减少类的可复用 性,并使实现和测试复杂化。
由子类覆盖的操作数量NOO
有的子类,为了自身需要,用自己的特定版本代替从父类继承的操
作,这称为覆盖。NOO的值越大,说明子类覆盖的操作越多。 较高的NOO可以提高类的复用性,并减少实现和测试的复杂性;但 是如果NOO过大,则违反了超类所蕴含的抽象,削弱了类的层次结 构,使得测试和修改的难度增大。
的深度,从继承的角度反映了类的复杂性。DIT越大,复 杂性也越大。 DIT度量被定义为“从结点到树根的最大长度”,类的继 承树深度可以直接从继承树中得到,树根的深度为零。 一般来说,DIT越大,它从父辈类中继承下来的属性和方 法就越多,类的复杂性就越大。随着DIT的增大,低层次 的类可能会继承很多方法,其行为的预测变得困难;但 是当DIT值很大时,又意味着很多方法被复用。 那些拥有众多方法的类更可能适合特定领域的应用,从 而限制了其重用。
15.4.2 LK度量套件
LK度量组是由Lorenz和Kidd提出的,他们把基于类的度量分 为4种类型:规模、继承、内部特性和外部特性。 类的规模CS
在类中被封装的操作(继承和私有实例的操作)的总量。 在类中被封装的属性(继承和私有实例的属性)的总量。 CK套件中的WMC实际上也是类的规模的度量。与WMC相类似,如
由子类增加的操作数量NOA
子类是通过加入私有操作或属性实现实例化。当NOA的
值增大时,则子类漂离超类所隐含的抽象。当类层次的 深度增大时,在低层的类的NOA的值将下降。
特例化指标SI
特例化指标为OO系统中的每一个子类提供了特例化等级
的粗略指示,可以通过增加或删除操作或覆盖实现。 SI=[NOO×level]/Mtotal,其中,level表示类在类层次中的 层数,Mtotal表示类方法的总数。 SI的值越大,类层次中包含了不遵从超类抽象的类的可能 性也就越高。
15.1.3 信息隐蔽
信息隐蔽是指隐藏了程序构建的操作细节,只将访问该构件 所必需的信息提供给那些访问该构件的其它构件。 OO方法和传统方法是一致的。 继承是指一个对象的属性和操作能够传递给其它对象的机制。 继承发生在类层次的所有层面上。 通常,传统软件不支持这种特性。继承是OO系统的一个重 要的关键特性,因此,很多OO系统的度量以此为重点,包 括子女的数量(类的直接子类的数量)、父辈数(直接上层 的数量)、类的嵌套层次(在一个继承层次中类的深度)等 等。
如果一个类作用于其他类,比如一个类的方法或实例被
另一个类的方法使用了,就称为耦合。 CBO指的是类之间合作的数量,是与一个类相耦合的他 类的个数。 CBO反映了类和其它类之间的耦合程度。类之间的耦合 不利于系统的模块化设计,类的耦合度越大,独立性越 小,越容易受系统中其它部分的影响,越不易于重用。 当CBO增大时,不仅降低了可重用性,而且使其修改和 修改后的测试变得复杂。所以,每个类的CBO值应当保 持合理。这与在传统软件中减少耦合的一般原则是一致 的。
15.4.1 CK度量套件
CK度量套件(度量集)是一组针对类的度量,主要 由Chidamber和Kemerer根据度量理论和有经验的 面向对象软件开发人员的建议提出,他们建议使用 6种基于设计的度量,度量面向对象系统中的单个 类,从不同方面给出了评价类的准则。
类的加权方法数(WMC):
类的加权方法数反映了类的复杂性.一般来说,类的方
例:下图是ATM系统的部分类视图,对该系统进行类的
响应的计算。
类 ATM Inquiry MessageForm
响应集合 ATM, cardInsert, inquiryReq, Inquiry, inquiry, doTransaction Inquiry, inquiry, doTransaction, MessageFrom, display, BankAccount, inquiry MessageForm, display
RCF 6 7 2
BankAccount
BankAccount, changePassword, inquiry
3
方法中内聚性的缺乏(LCOM) :
类的内聚性表明了类中所有元素相互联系的程度,内聚性的高低表
明对类所进行的封装是否合理。设计合理的类中的元素之间的关系 应该比较紧密,因此内聚性要求较大。 一个类中的每个方法可能会访问一个或多个属性,LCOM是访问一个 或多个相同属性的方法的数量。如果没有方法访问相同的属性,则 LCOM=0。如果一个类中总共有10个方法,其中6个方法共用一个或 多个属性,则LCOM=6。 如果LCOM的值比较大,说明该类中的某些方法通过属性与其它方法 耦合,缺乏内聚的程度大,类中的元素关联程度较低,对类进行的 封装可能具有不合理之处,增加了设计的复杂性,通常把它分为两 个或多个独立的类。我们总是希望LCOM值比较低,这与传统软件中 的高内聚、低耦合是一致的。
15.2 分析、设计模型的度量
对设计的客观观察应该有量化的成分——从而导向 OO度量。在现实中,OO系统的技术度量不仅应用 于设计模型,也可应用于分析模型。 Whitmire描述了9个关于OO设计的可测度特征:
大小(size)
复杂性
耦合性 充足度
完备性
内聚性 原始性 易变性
15.1.4 继承
15.1.5 抽象
抽象是使设计者只关心程序构件的主要细节(数据和过程)、 而不考虑低层细节的一种机制。 抽象是一种相对概念,在OO和传统开发方法中都被采用, 处于抽象的较高层次时,可以忽略更多的细节,只提供一个 关于概念或项的更一般的视图;处于抽象的较低层次时,可 以引入更多的细节,即提供一个关于概念或项的更详细的视 图。 在OO系统中,类从许多不同的细节层次上并以许多不同方 式(如作为一个操作列表、一个状态序列、或是一系列协作) 来观察,因此,OO度量可以用一个类度量的项作为抽象的 表示,如每个应用类实例化的数量、每个应用类被参数化的 数量,以及类被参数化的数量与未被参数化的数量的比例等。
15.4.3 MOOD度量套件
MOOD度量套件是由Harrison、Counsell和Nithi提 出的,是OO设计特征的一组量化指标,它从整个 面向对象系统的角度对系统的面向对象特征进行评 估。 MOOD度量方法从封装、继承、耦合、多态性四个 方面提出了6个度量元。每一个度量的计算都是以 商的形式给出,分子是系统中特定机制的实际使用 次数,分母是同样的机制最大可能的使用次数。因 此,每一个度量的值都介于【0,1] 。
3
Transaction
ATM,BankServer,BankAccount,Log
4
Log
Transaction
1
对类的响应(RFC) :
方法可能调用类外的方法,加入对他们的度量,是增加
了对类间潜在通信的度量。 类的响应集合从另一个方面度量类的复杂度,它是所有 可能被该类调用的方法的集合,执行它可以响应接收到 的类对象的消息。RFC定义为响应集中方法的数量。 当RFC增大时,测试序列增大,测试工作量也增加了, 类的总的设计复杂度也随之增大。
法数越多.类越复杂。由于类中不同方法的复杂程度不 一致,所以不能用单纯的方法数相加于一个有m个类的系统而言,其WMC是m个类的类加 权方法的平均值,即 m
WMC
WMC
j 1
j
m
其中WMCj为第j个类的加权方法。 方法数和其复杂度可以预测开发和维护该类所需的时间 和人力; .由于类继承了父类的所有方法,父类的方法数越多,对 类的潜在影响越大; .那些拥有众多方法的类更可能适合特定领域的应用,从 而限制了其重用。