ISSN1000-9825,CODENRUXUEWE-mail:jos@iscas.ac.cnJournalofSoftware,Vol.21,No.11,November2010,pp.2701−2710:+86-10-62562563©byInstituteofSoftware,theChineseAcademyofSciences.Allrightsreserved.逆向工程中的大类图拆分方法∗刘辉1,2,4+,邵维忠2,3,麻志毅2,31(北京理工大学计算机学院,北京100081)2(高可信软件技术教育部重点实验室,北京100871)3(北京大学信息科学技术学院软件研究所,北京100871)4(北京理工大学计算机学院智能信息技术北京市重点实验室,北京100081)DecompositionofLargeClassDiagramsGeneratedbyReverseEngineeringLIUHui1,2,4+,SHAOWei-Zhong2,3,MAZhi-Yi2,31(SchoolofComputerScienceandTechnology,BeijingInstituteofTechnology,Beijing100081,China)2(KeyLaboratoryofHighConfidenceSoftwareTechnologies,MinistryofEducation,Beijing100871,China)3(SoftwareInstitute,SchoolofElectronicsEngineeringandComputerScience,PekingUniversity,Beijing100871,China)4(BeijingLaboratoryofIntelligentInformationTechnology,SchoolofComputerScienceandTechnology,BeijingInstituteofTechnology,Beijing100081,China)+Correspondingauthor:E-mail:liuhui04@sei.pku.edu.cnLiuH,ShaoWZ,MaZY.Decompositionoflargeclassdiagramsgeneratedbyreverseengineering.JournalofSoftware,2010,21(11):2701−2710.:Thispaperproposesanapproachtodecomposelargeclassdiagrams.Itfirstcollectsmetricsofcouplingamongclassifiers(classesandinterfaces).Accordingtotheprincipleofhighcoheringandlowcoupling,itbreakslowcouplingclassifierswhileshowinghighcouplingclassifiersinthesamediagrams.Toguaranteethatthegeneratednewclassdiagramsarereadable,itconfinessizesofnewdiagramstoapredefinedscope.Theresultsofitsevaluationsonindustrialprojectssuggestthattheapproachispracticalandvaluable.Theapproachproposedinthispaperhelpstoimprovethereadabilityofsoftwaremodels.Keywords:classdiagram;unifiedmodelinglanguage(UML);reverseengineering;softwaremaintenance摘要:提出了一种大类图拆分方法.首先通过度量工具计算类图中类目(类及接口)间的耦合度.根据面向对象设计中高内聚低耦合的设计原则,将紧耦合的类目划入同一个类图,而耦合度低的类目间实现分离.为了确保生成的类图大小合适,拆分方法对每个类图的大小进行限定,将每个类图的大小限定在预先定义的合理区间内.∗SupportedbytheNationalNaturalScienceFoundationofChinaunderGrantNos.60773152,61003065(国家自然科学基金);theNationalHigh-TechResearchandDevelopmentPlanofChinaunderGrantNo.2007AA010301(国家高技术研究发展计划(863));theOpenResearchFundProgramofKeyLaboratoryofHighConfidenceSoftwareTechnologies,MinistryofEducation,China,underGrantNo.HCST200802(高可信软件技术教育部重点实验室开放研究基金);theOpenResearchFundProgramofBeijingLaboratoryofIntelligentInformationTechnology(智能信息技术北京市重点实验室开放研究基金);theBasicResearchFoundofBeijingInstituteofTechnologyofChina(北京理工大学基础研究基金)Received2008-10-23;Accepted2009-06-012702JournalofSoftware软件学报Vol.21,No.11,November2010通过在实际系统中的应用,拆分方法的合理性和有效性得到验证.该大类图拆分方法有利于逆向工程的进一步完善,有利于提高软件模型的可读性和可理解性.关键词:类图;UML;逆向工程;软件维护中图法分类号:TP311文献标识码:A软件模型是软件开发与维护中的核心制品.与于源代码相比,软件模型具有较高的抽象层次、较好的可读性和可理解性.因此,软件模型在软件开发和维护中具有不可替代的作用.尤其是在软件维护中,软件维护人员可能没有参与软件的开发,需要通过软件本身(包括代码、文档和模型等)来理解待维护的软件系统.阅读软件模型是维护人员理解软件系统的主要途径之一.但是,许多软件系统并没有提供软件模型.其原因之一是软件开发过程不规范,没有严格的分析与设计阶段,所以昀后提交的软件制品没有系统的分析与设计模型.另一个可能的原因是商业模式.开发团队虽然设计了详细的软件模型,但出于商业原因没有给软件维护人员提供软件的分析与设计模型.无论出于何种原因,缺少软件模型都将使软件维护更加困难.解决缺乏分析设计模型的主要方法之一是通过逆向工程(reverseengineering)[1]从代码生成软件模型.逆向工程是一项年轻的、快速发展中的技术.现有的主流建模工具都提供了一定的逆向工程能力.RationalRose[2],Together[3],JUDE[4],JBOO[5]等都可以从源代码中生成以统一建模语言(unifiedmodelinglanguage,简称UML)[6]表示的软件模型.目前,逆向工程得到的模型多半限于系统的静态模型(某些逆向工程工具也可以生成诸如顺序图等动态模型,但目前生成的动态模型的实用价值还有待进一步提升)[7].类图(classdiagram)是逆向工程中昀常见的,也是昀有用的模型之一.邵维忠和杨芙清[8]认为,在面向对象模型中,类图是昀基本的、昀重要的模型,而其他各种图(比如顺序图、状态图和用况图)则起辅助作用(具体分析详见该书第3章).构成类图的主要成分包括类、属性、操作以及类之间的关系(继承、聚合、关联、依赖等).类图中的类、属性和操作都与源代码中的相应概念一一对应,所以类图的逆向生成较为直接.这也是类图在逆向工程中获得较好支持的一个重要原因.虽然类图在逆向工程中获得了较好的支持,但是目前主流的逆向工具所生成的类图往往过于庞大,影响类图的阅读和理解.如图1所示的类图即为JUDE在元建模平台Meta-Modeler[9]上逆向工程得到的一个类图(经过手工调整和优化布局).这个类图包含的元素(类及接口)多达35个.按照“7±2”原则[10],人在一段时间内能够理解和记忆的事物是有一定数量限制的,一般不超过72,±所以,多达35个元素的庞大类图不利于软件维护人员的阅读和理解.在类图的显示上也会遇到问题,比如图1所示的类图就很难看清其中的文字(类名、属性、操作等).如果要放大类图以看清文字,又难以完整地展示类图的结构,从而难以看清元素之间的关系.所以,我们需要某种方法将逆向工程生成的大类图拆分为多个大小合适的小类图,以提高类图的可读性和可理解性.大类图的生成与现有逆向工具的工作方式有关.现有的逆向工具通常按类(接口)的命名空间(namespace)来组织,将同一个命名空间下的所有类和接口都放入同一个类图.另外一些工具则根据包(package)或目录(directory)来组织,将某个目录及子目录下的所有类及接口组织为一个类图.但在实际工程中,一个命名空间或者一个目录下可能包含大量的类及接口定义.还有部分逆向工程工具甚至将项目所包含的所有类目都放入一个单一的类图中.这种超大类图的可读性极差.为了解决逆向工程生成的类图难以阅读和理解的问题,本文提出了一种将大类图拆分为多个大小合适的紧凑类图的方法.将紧耦合的类目划分到同一个类图,而松耦合的类目之间实现分离,从而控制类图的大小.本文第1节介绍大类图的拆分方法.第2节通过实验验证本文提出的拆分方法的实用性.第3节对拆分方法进行讨论.第4节介绍并讨论相关工作.第5节总结本文工作并指出进一步的研究方向.刘辉等:逆向工程中的大类图拆分方法2703Fig.1ClassdiagramgeneratedbyJUDE图1JUDE逆向工程生成的类图1类图拆分方法本节首先介绍类目(classifier,包括类和接口等[6])之间的耦合关系.基于类目间的耦合关系,本文提出了一种拆分大类图的方法.1.1逆向工程生成的类图类图是展现系统静态结构的主要视图.主要元素包括类目(类和接口)以及类目间的关系(关联、依赖、继承、组合、聚合).类可以包含属性和操作,接口也可以包含操作.因为本文的类图拆分算法并不拆分类目的内部结构,所以将类和接口都作为单一的元素来考虑.聚合关系表示类目之间的整体-部分关系.而组合关系是聚合的一个特例,表示部分和整体具有相同的生命周期或者部分只为该整体所拥有.目前,逆向工程工具通常不区分这两种关系,统一表示为聚合关系,所以本文也将聚合和组合统一表示为聚合.基于以上分析,可以将逆向工程生成的类图表示为{,,,,}ClassDiagramCAssDepInhAgg=(1)其中,C表示类图包含的类目;Ass表示类图中的关联关系,如果类目12,ccC∈且有从c1到c2的关联关系,则12,,ccAss〈〉∈如果是双向关联,则1221,,;ccAssccAss〈〉∈∧〈〉∈与Ass类似,Dep表示类图中的依赖关系,Inh表示类图中的继承关系,Agg表示类图中的聚合关系.1.2耦合耦合是软件度量中的一个重要概念.Stevens等首次提出耦合的概念,并将耦合定义为“模块间关联强度的度量”.为了度量面向对象系统的耦合关系,人们已经提出了大量的度量指标及度量框架[11],比如对象间耦合(couplingbetweenobjects,简称CBO)、消息传递耦合(messagepassingcoupling,简称MPC)、数据抽象耦合(dataabstractionco