软件工程-第15章

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


由子类增加的操作数量NOA
子类是通过加入私有操作或属性实现实例化。当NOA的
值增大时,则子类漂离超类所隐含的抽象。当类层次的 深度增大时,在低层的类的NOA的值将下降。

特例化指标SI
特例化指标为OO系统中的每一个子类提供了特例化等级
的粗略指示,可以通过增加或删除操作或覆盖实现。 SI=[NOO×level]/Mtotal,其中,level表示类在类层次中的 层数,Mtotal表示类方法的总数。 SI的值越大,类层次中包含了不遵从超类抽象的类的可能 性也就越高。
果CS的值比较高,说明一个类有很多功能,这就会减少类的可复用 性,并使实现和测试复杂化。

由子类覆盖的操作数量NOO
有的子类,为了自身需要,用自己的特定版本代替从父类继承的操
作,这称为覆盖。NOO的值越大,说明子类覆盖的操作越多。 较高的NOO可以提高类的复用性,并减少实现和测试的复杂性;但 是如果NOO过大,则违反了超类所蕴含的抽象,削弱了类的层次结 构,使得测试和修改的难度增大。
例:下图是ATM系统的部分类视图,对该系统进行类的
加权方法计算(假定方法的复杂度都为1)。
类名 Transaction TransferAccount Withdraw Inquiry
方法 2 3 1 1
WMC=7/4=1.75方法/类

继承树的深度(DIT):
DIT指从结点到根的最大长度,即对象所属类在继承树中
法数越多.类越复杂。由于类中不同方法的复杂程度不 一致,所以不能用单纯的方法数相加来衡量类的复杂程 度,而需要把每个方法赋予一个权值。 对于一个有m个类的系统而言,其WMC是m个类的类加 权方法的平均值,即 m
WMC
WMC
j 1ຫໍສະໝຸດ Baidu
j
m
其中WMCj为第j个类的加权方法。 方法数和其复杂度可以预测开发和维护该类所需的时间 和人力; .由于类继承了父类的所有方法,父类的方法数越多,对 类的潜在影响越大; .那些拥有众多方法的类更可能适合特定领域的应用,从 而限制了其重用。
15.2 分析、设计模型的度量
对设计的客观观察应该有量化的成分——从而导向 OO度量。在现实中,OO系统的技术度量不仅应用 于设计模型,也可应用于分析模型。 Whitmire描述了9个关于OO设计的可测度特征:

大小(size)
复杂性
耦合性 充足度
完备性
内聚性 原始性 易变性
15.1.3 信息隐蔽

信息隐蔽是指隐藏了程序构建的操作细节,只将访问该构件 所必需的信息提供给那些访问该构件的其它构件。 OO方法和传统方法是一致的。 继承是指一个对象的属性和操作能够传递给其它对象的机制。 继承发生在类层次的所有层面上。 通常,传统软件不支持这种特性。继承是OO系统的一个重 要的关键特性,因此,很多OO系统的度量以此为重点,包 括子女的数量(类的直接子类的数量)、父辈数(直接上层 的数量)、类的嵌套层次(在一个继承层次中类的深度)等 等。
RCF 6 7 2
BankAccount
BankAccount, changePassword, inquiry
3

方法中内聚性的缺乏(LCOM) :
类的内聚性表明了类中所有元素相互联系的程度,内聚性的高低表
明对类所进行的封装是否合理。设计合理的类中的元素之间的关系 应该比较紧密,因此内聚性要求较大。 一个类中的每个方法可能会访问一个或多个属性,LCOM是访问一个 或多个相同属性的方法的数量。如果没有方法访问相同的属性,则 LCOM=0。如果一个类中总共有10个方法,其中6个方法共用一个或 多个属性,则LCOM=6。 如果LCOM的值比较大,说明该类中的某些方法通过属性与其它方法 耦合,缺乏内聚的程度大,类中的元素关联程度较低,对类进行的 封装可能具有不合理之处,增加了设计的复杂性,通常把它分为两 个或多个独立的类。我们总是希望LCOM值比较低,这与传统软件中 的高内聚、低耦合是一致的。
15.3 OO项目的度量
项目管理人员的任务是计划、协调、跟踪和控制软 件项目的进行。其中第一个活动就是计划,而早期 的计划任务之一是估算。项目管理者在计划过程中 面临的主要问题之一就是如何对软件的实现规模进 行估算。 Lorenz和Kidd提出了用于OO项目的度量:

场景脚本的数量 关键类的数量
软件工程 第15章 面向对象系统的 技术度量
OO度量是OO技术不可分割的一部分,在O0软件开 发中具有重要的作用。利用度量能定量理解系统的 体系结构和详细设计,利用度量的反馈信息以构造 质量更好的系统;提供OO项目开发成本估算和进 度预计的良好基础;有助于确定各种软件开发策略 的作用和效果。 与其他方法相比较,OO量度的使用和发展要晚得 多。与传统软件一样,OO量度的主要目的是:更好 地理解产品的质量,评价过程的效率,改进项目级 别完成工作的质量。
如果一个类作用于其他类,比如一个类的方法或实例被
另一个类的方法使用了,就称为耦合。 CBO指的是类之间合作的数量,是与一个类相耦合的他 类的个数。 CBO反映了类和其它类之间的耦合程度。类之间的耦合 不利于系统的模块化设计,类的耦合度越大,独立性越 小,越容易受系统中其它部分的影响,越不易于重用。 当CBO增大时,不仅降低了可重用性,而且使其修改和 修改后的测试变得复杂。所以,每个类的CBO值应当保 持合理。这与在传统软件中减少耦合的一般原则是一致 的。

子女的数量(NOC):
类的直接子类个数(NOC):在类层次中,直接从属于某类
的子类称为该类的子女。类的直接子类个数反映了该类 的重用程度。 NOC越大,类的重用性越好。对系统的影响就越大。类 的直接子类个数可以从继承树中得到。 随着NOC的增大,针对每个子女的测试数量也增加了。

对象类之间的耦合(CBO) :
的深度,从继承的角度反映了类的复杂性。DIT越大,复 杂性也越大。 DIT度量被定义为“从结点到树根的最大长度”,类的继 承树深度可以直接从继承树中得到,树根的深度为零。 一般来说,DIT越大,它从父辈类中继承下来的属性和方 法就越多,类的复杂性就越大。随着DIT的增大,低层次 的类可能会继承很多方法,其行为的预测变得困难;但 是当DIT值很大时,又意味着很多方法被复用。 那些拥有众多方法的类更可能适合特定领域的应用,从 而限制了其重用。
例:下图是ATM系统的部分类视图,对该系统进行类的
响应的计算。
类 ATM Inquiry MessageForm
响应集合 ATM, cardInsert, inquiryReq, Inquiry, inquiry, doTransaction Inquiry, inquiry, doTransaction, MessageFrom, display, BankAccount, inquiry MessageForm, display
例:下图是ATM系统的部分类视图,对该系统进行类的
耦合的计算。

耦合类
CBO
ATM
BankServer,BankAccount,Transaction
3
BanServer
ATM,BankAccount,Transaction
3
BankAccount
ATM,BankServer,Transaction
15.4.1 CK度量套件

CK度量套件(度量集)是一组针对类的度量,主要 由Chidamber和Kemerer根据度量理论和有经验的 面向对象软件开发人员的建议提出,他们建议使用 6种基于设计的度量,度量面向对象系统中的单个 类,从不同方面给出了评价类的准则。

类的加权方法数(WMC):
类的加权方法数反映了类的复杂性.一般来说,类的方
3
Transaction
ATM,BankServer,BankAccount,Log
4
Log
Transaction
1

对类的响应(RFC) :
方法可能调用类外的方法,加入对他们的度量,是增加
了对类间潜在通信的度量。 类的响应集合从另一个方面度量类的复杂度,它是所有 可能被该类调用的方法的集合,执行它可以响应接收到 的类对象的消息。RFC定义为响应集中方法的数量。 当RFC增大时,测试序列增大,测试工作量也增加了, 类的总的设计复杂度也随之增大。
15.1.4 继承

15.1.5 抽象



抽象是使设计者只关心程序构件的主要细节(数据和过程)、 而不考虑低层细节的一种机制。 抽象是一种相对概念,在OO和传统开发方法中都被采用, 处于抽象的较高层次时,可以忽略更多的细节,只提供一个 关于概念或项的更一般的视图;处于抽象的较低层次时,可 以引入更多的细节,即提供一个关于概念或项的更详细的视 图。 在OO系统中,类从许多不同的细节层次上并以许多不同方 式(如作为一个操作列表、一个状态序列、或是一系列协作) 来观察,因此,OO度量可以用一个类度量的项作为抽象的 表示,如每个应用类实例化的数量、每个应用类被参数化的 数量,以及类被参数化的数量与未被参数化的数量的比例等。
支持类的数量 每个关键类的平均支持类数量
子系统的数量
15.4 面向类的度量
经过近年来的研究,人们已经根据面向对象
系统的特点提出了一系列面向对象度量,有 的得到了广泛的认可和应用。这些度量分别 从面向对象系统本身和系统中单个类的角度 进行度量.其中较有名的有C&K度量集和 Mood度量集。

OO度量的几个准则

根据面向对象度量的特点,在满足一般度量理论的 基础上,构造面向对象程序所适用的度量还应该遵 循以下几个准则:
(1)度量需要反映某一个面向对象的特征(继承、封装、多态)。 (2)对于面向对象程序每一个方面的特征,要从单个类和整个 面向对象系统两个角度进行度量; (3)单一的度量可能不能全面描述某一个面的特征,必须用一 组度量从多个方面来反映;
15.1.2 封装


封装是指一组项的包装。 传统软件中的记录、数组只有数据没有过程,是低层次的封 装;子程序(如过程、函数、子例程、段等)只有过程没有 数据,是中层的封装。其度量的重点在代码行的计数和环复 杂度。 在OO系统中,封装包含了类的职责(包括类的属性和操作) 以及特定的类属性值定义的类的状态。其度量的重点不是单 一的模块,而是包含数据和过程的包,是在较高抽象层次上 的度量。
15.4.2 LK度量套件

LK度量组是由Lorenz和Kidd提出的,他们把基于类的度量分 为4种类型:规模、继承、内部特性和外部特性。 类的规模CS
在类中被封装的操作(继承和私有实例的操作)的总量。 在类中被封装的属性(继承和私有实例的属性)的总量。 CK套件中的WMC实际上也是类的规模的度量。与WMC相类似,如
15.1 OO度量的识别特征
任何产品的技术量度都取决于产品的特性。OO软件与 使用传统方法开发的软件的度量方法截然不同,Berard 定义了OO软件的5个特征:
15.1.1 局部化


局部化指信息被集中在一个程序内的方式。 传统方法中:数据与过程分离、功能分解,实现了功能局部 化。传统软件工程使用数据驱动功能,其度量着重放在模块 内部结构或复杂性(如模块规模、内聚性、环复杂度等)或 模块间相互连接的方式(如模块耦合)上。 在OO系统中,类是OO系统的基本单位,对象封装数据和过 程,所以局部化是基于对象的,因此,要把类(对象)作为 一个完整实体进行度量。而且,操作和类之间的关联不一定 是“一对一”的,所以,类合作的度量必须能适应“一对多” 或“多对多”的关联。
15.4.3 MOOD度量套件
MOOD度量套件是由Harrison、Counsell和Nithi提 出的,是OO设计特征的一组量化指标,它从整个 面向对象系统的角度对系统的面向对象特征进行评 估。 MOOD度量方法从封装、继承、耦合、多态性四个 方面提出了6个度量元。每一个度量的计算都是以 商的形式给出,分子是系统中特定机制的实际使用 次数,分母是同样的机制最大可能的使用次数。因 此,每一个度量的值都介于【0,1] 。
相关文档
最新文档