UML软件工程组织

用预测性对象点度量面向对象软件(上)
51CMM.COM编译 作者:Arlene F. Minkiewicz PRICE Systems, L.L.C. 刘秋林 译
 摘要
意识到传统的软件度量方法不能满足面向对象软件的生产力跟踪和工作量预测的需要,PRICE Systems 开发了一种新的度量方法~预测性对象点。预测性对象点是特意为面向对象软件设计的,是通过系统计算面向对象的特征进行度量。本文论述了传统度量方法的问题,介绍了预测性对象点的形成,包括相关理论和数据,最后是用预测性对象点进行度量的一个例子。
前言
近年来,面向对象技术已经作为一种有优势的软件工程方法出现。和其他许多新技术一样,面向对象方法的出现使得软件开发人员和他们的经理们必须重新考虑估计他们开发项目的方法。传统的软件度量技术即使进行改善也无法满足度量生产力和预测工作的需要。源代码行和功能点方法都是程序需要将数据和过程分解开的时代特有产物。这和面向对象范畴有冲突。传统的设计技术将数据和过程分离而面向对象技术将他们联合在一起。如果要提供准确的工作预测或生产力跟踪,面对对象度量方法必须有多个尺度(度量维)。计算交付给客户的软件具有功能数非常重要,但对象间交流的信息和通过继承的重用对规模度量也非常重要。本文论述了预测性对象点(Predictive Object Points POPs),一种包含前面提到的面对对象3个尺度的度量方法。不像传统的度量方法基于结构分析的数据和过程模型,POPs是基于对象和他们的特征。POPs综合了文献中几种流行的度量方法,建立一种适合预测工作量和跟踪生产力的方法。POPs方法的核心是每类加权方法数(Weighted Methods per Class WMC)。这种方法测量每个顶层类(或者说,每个在用户的视野中清楚的对象)并且根据类的行为(方法)类型不同进行加权。一旦得到WMC的值,POPs方法将把它和有关按类分对象组的信息和对象类之间的关系进行联合计算。接下来本文将论述POPs方法形成过程和有关工作研究结果,并且介绍一个预测性对象点方法应用的例证。通过对一个公用领域的面向对象项目的使用,能指导读者认识计算预测性对象点的机理。
传统的度量有什么错误
传统的度量方法在一些度量过程中还占有一席之地。一些年来,软件开发人员和软件估计人员使用源代码行(SLOC)或者功能点方法估计要建设的面向对象软件项目的工作量,这不是因为他们选用的方法是最好的,但却可能是最适合的,常常在组织面向对象过程不够成熟时他们比较适合。相反地,当组织越来越善于设计和开发面向对象软件时,这些传统的方法变得越来越没有用了,因为每个开发人员的代码行变得和其他人员的不是很相似。变化的原因很明显,他们已经停止了思考每一行代码是怎样和另一行代码相匹配,停止了结构化分析,走向面向对象方法的道路。首先我们不妨想想传统的程序方法和它是怎么发展的。最初,软件开发人员被迫将的软件方案完全分解,因为最早的程序语言需要辛苦地一步一步描写要实现的每一个方案的动作。随着编程的发展,越来越多的一步步描写变成了一个简单的编译命令。但是还需要分解功能业务。 结构化分析需要开发人员按过程连续地思考和编程,编写每一行代码,每一个函数和每个子系统,每一个产品,都是一种单一连续思维。在这种对源代码和函数单一的思想下,很容易想到像代码行和功能点这样度量方法。但面向对象技术要求人们完全转变思想。一个方案不再根据需要实现它的步骤进行分解。它宁愿分解成一个个包含在方案的动作者,当然分解出来的动作者必须对方案有作用。方案空间分解为动作者和动作者的行为。既然动作者和他们的行为受他们内部之间相互作用或者环境的影响,所以每一行代码的想法需要考虑许多可能的作用在动作者上的路径。基于连续程序开发模型的度量方法将会错过这种相互作用所导致的复杂性。 
相关研究
面向对象度量的研究,无论如何不是一块未曾开垦的处女地。Chidamber 等曾提出一套面向对象度量,其中包括一些度量规模的方法,他们都是很好地根据度量理论创立的[4]。Lorenz发布了一张11个“构思度量”的表,其中有些能很好适用于规模度量[16]。其他一些学者在收集软件开发工作不同的度量尺度时做出了贡献。Henderson-Sellers收集形成了一个这些方法的全部名单[2]。由于以前每种方法都是致力于面向对象软件的规模的一个度量尺度,这些方法没有一个能单独用作一个很好的规模预测器。Whitmire提出了3-D功能点[19],这是一种扩展的功能点方法,度量软件项目的数据、控制和功能。然而3-D功能点采用的是传统的功能点思想处理遇到的问题,他可以度量所有3个尺度,但只能完成在类的水平。这就使得3-D功能点能作为一个完整的软件生产力分析的方法,但不可能用作工作量预测。
表1列出了一些比较流行的适合于面向对象软件度量方法和他们可以度量系统特征方面。

度量方法

适用的度量方面


用例/情节脚本数(Number of use cases/scenario scripts)

规模 


每类加权方法(Weighted Methods per Class (WMC))

规模,复杂性


每类方法(Methods per Class)

规模 


子类数(Number of Children (NOC))

规模,复杂性


继承树深度(Depth in Inheritance Tree (DIT))

规模,复杂性


方法大小(Method Size(LOC))

规模


3-D 功能点(3-D Function Points)

规模,复杂性


对象间的耦合(Coupling Between Objects (CBO))

耦合


每类实例化变量数(Number of Instance Variables per class)

复杂性


独立消息发送数(Number of unique messages sent)

耦合/复杂性


超类数(Number of classes inherited(derived classes))

复杂性


派生类数(Number of classes inherited from (base classes))

复杂性


重用率(Reuse Ration)

品质,复杂性


表1 一些流行的面向对象度量方法 
面向对象软件的度量尺度结构
传统度量方法应用于面向对象解决方案时的问题是只度量软件的一个尺度,即功能。没有度量对象与对象间通信的复杂性和通过继承的重用数量,传统功能性度量忽略了软件规模至关重要的这两个方面。功能(对象的行为)是你预测工作量时一个重要的信息,但只是考虑这个方面,在设计得比较好的面向对象方案中会明显证明是错误的。在功能之外,还有基于系统对象间通信数量的复杂水平。这种复杂性充分影响项目规模。对象间的通信增加,就需要更多的详细设计和对象测试,他们就是在增加更多的系统服务。面向对象规模的第三个尺度是通过继承的重用。部分优秀的面向对象分析员潜心识别对象(动作着),将行为足够相似的分成一个相同的类或一个相同的类族。 类是通过行为和属性进行描述,实例化就有了具体的对象。一组有许多相似行为的对象常常设计为基类(或者父类),基类包含可以供派生类(或者子类)继承的一般方法,子类也可以添加新的方法和通过重载父类方法实现父类定义的方法中没有提供的功能。 继承是面向对象软件系统一个强有力的特征,在某些软件项目,它有可能大大减少项目工作量。
度量所有的三维
已经确定传统的度量方法缺少准确估计软件规模的三维中的两维,下一步的就是确定一种能合并所有三维的度量方法或者度量方法集合。预测性对象点,本文的主题,综合了最近文献中出现的几种度量面向对象的软件的方法。他们是所有关于软件系统面向对象分析和设计的度量方法。这些方法度量项目面向的最重要方面~开发的类,类的方法和类的方法对系统其他部分的作用。他们也联合度量拟定类结构的广度和深度。包含在POPs计算的度量方法有:
顶层类数(Number of Top Level Classes TLC )
每类的加权平均方法数(Average Number of Weighted Methods per Class WMC)
平均继承树深度(Average Depth of Inheritance Tree DIT )
平均每基类的子类数(Average Number of Children per Base Class NOC)
下面接着是描述上面的每一种度量并介绍他们在POPs 度量方法中为什么重要。 
顶层类数 (TLC) 
这个度量是计算类图中根部的类的多少,其他所有的类都是继承他们。因为POPs计算带有预测目的,所以能分析系统的顶层信息非常重要。顶层类数和NOC、DIT能提供估计面向对象系统广度和深度的计算基础。这就添加了通过继承重用的度量维到POPs计算。 
每类的加权平均方法数(WMC) 
这是每类的方法平均数,每个方法要通过根据方法的类别,方法影响的属性数和方法提供给系统的服务数确定的复杂性不同进行加权。这是POPs 计算的核心。调查显示在决定面向对象度量方法对规模估计适合性方面有两个冲突的思想学派(记住,这个规模要联系工作量和生产力)一个是不同的对象总数(the total number of distinct objects)计算[10], [11]。另外一个用每对象类平均加权的方法数(WMC) [4], [12], [9], [16]。虽然对象数被称为一种工作量估计的好方法,但我偏好于WMC是由于以下几方面原因: 
方法与行为相联系 
早在分析时知道系统拟定的行为,它使得更加容易在软件生命周期早期阶段进行可信的规模估计。 
WMC计算方法加强了计算过程的严密性。在POPs计算,每类的加权平均方法数体现了系统的功能和对象间通信。 
平均继承树深度(DIT) 
每个类要不被称为根类要不被称为派生类。那些不像根类那样,没有地方继承的类都是派生类。DIT对于一个类来说意味着它在继承树中的深度,也就是从根类到这个类的长度(层的数字),在图2中,类C的DIT是3,因为在根类A和类C 之间有三层。平均DIT和TLC、 NOC一起用来确定通过继承的重用度和整个系统的规模。

图2 继承树例子
平均每基类的子类数(NOC) 
每个类有0个或者更多的直接子孙(派生类)。NOC 是对派生类的计算。在图2中,类A的NOC是3,它有三个子类。父类上的NOC用来确定通过继承的重用度和整个系统的规模 。
 

版权所有:UML软件工程组织