其中:C是非空集,如实数集;Sj是C元素之间的形式关系,如>、<、二等;Bk是C元素之间的二元形式操作。如+、一、*等。
4)评估度量准则:度量准则M是D到F的同构映射,满足:
;;
。
3.1.2测距理论(Theory of Distance Measurement)
经过近年来的研究,人们已经根据面向对象系统的特点提出了一系列面向对象度量,其中内聚性度量是软件度量学中一个重要的研究领域。在多次软件工程会议和一些软件工程杂志上不断有这方面的研究成果。
1)分组与相似性
“把相似的对象组成一类”是软件工程中的主要原则之一。这种设计风格对结构化分析(如层次数据流图)和面向对象系统开发都是非常有效的。使用此原则我们可以把复杂的系统分成若干个子系统:一个包含若干子系统的复杂系统具有如下特征:以某种方式存在于子系统的“东西”存在共性(比如它们作用于相同的数据)。
因为每个问题域中的对象都应该有一个在软件系统中易定位的对象,所以把依赖分组的问题映射成计算机编程语言(如类或者包)能提高系统的可理解性。可见,在系统中良好选择的分组是一个非常重要的质量因素。
不同的标准有不同的分组,而且标准不存在“对”或者“错”。他们的正确性依赖于特定目标的可用性。比如说,基于功能的分组适用于修改系统中的工作流,而面向数据的分组适于于修改某些特殊的数据结构。
分析既定系统应将分组用作一个重要的因素。因而,精巧的分组使系统更容易分析。
分组操作与相似性/不相似性具有非常紧密的联系:分组的重要特征之一是组内所有的东西都相似,而组间所有的元素都不相似。为了能定量的分析事物的相似性,引入相似度是非常必要的。
2)相似度(Degree of Similarity)
定义1 相似度(Degree of Similarity) 若给实体的所有属性赋予相同的权重,且B是属性集{Pi}的有限子集,则两个实体x,y间的相似度为:
其中 ……………………①
从定义中可知:
1)相似性很大程度上依赖于视点(Point of View):通过计算两个不同属性集的相似度可得到既定实体对从“相同”到“相对”的结果;
相似性不是自身的属性:如果不论及既定属性,相似性描述就无从谈起;
相似性只存在于实体对,它不可归属于单个实体;
4)与“不相容”属性集B相关的实体间相似性没有被定义。如果实体对在集合B中都不存在属性,则B是实体对的相似性不相容(Similarity Incompatible)。这个观点只是在理论上成立,因为并不存在相对的实体。然而它对后面的提炼非常重要。
定义2集值距离函数(Set-valued Distance Function) 若{Pi}是所有属性集,则:
………………………………………②
上述定义满足:
1);
2);
3) 是对称的;
4) 对称或者布尔差分;
定义3 实值度量(Real-valued Metric) 若给所有的实体属性赋予相同的权重,则:
…………………………………………③
度量公式③满足:
1);
2);
3);
4)
实际上,度量公式③是不可行的,其原因是度量时会有太多的属性。大多数情况下要设定一个特定视点下的属性子集B。
定义4 相似性测量 若B是两实体的属性子集,则两实体x,y间的相似性测量公式为:
…………………④
3)测距(Distance Measurement)
由公式④很容易得到测距的形式化定义:
定义2.5 测距
………………………………………………………………⑤
从测距定义可得如下结论:
1)测距越小,相似性越大;测距越大,相似性越小;
2)如果两实体间的既定属性集相等,那么测距为0;
3)两实体的相似性不相容属性集在测距中没有被定义,原因是“不能用苹果和梨相比较”,至于不相容属性集在两实体间的测距中将无从谈起。
4)。
上面定义的测距同样支持内聚性度量,Bieman和Byung-Kyoo把内聚性定义为:内聚性是指模块组件聚合的程度。在早期的内聚性概念中,只是把内聚性赋予单个的实体,而此测距的引入,我们可深入观察单个实体,进而寻找引起内聚性的所有“吸力”(Attraction)。
在这里可我们可以用前一节中定义的度量的数学理论把测距描述成:
1)要计算实体间的距离必须简化既定属性,并抽象成实体模型(Entity Model)。实体模型的视点必须通过描述实体的所有属性的子集B被清晰地说明(比如一个函数只有唯一的属性“使用了同类中的值域x”,但是不函数不长也不复杂)。属性在这种场景下二进制的,即实体有或者没有属性;
2)经验关系系统(Empirical Relation System, ERS)包含实体模型对,这些实体模型对之间的测距可用公式⑤计算出。如果有n个实体模型,那么经验关系系统就有n2个实体模型对;
3)在经验关系系统中,为了达到顺序量表(Ordinal Scale),在两实体模型对之间至少存在一个关系“”——它是连接的(Connex)、反对称的(Antisymmetric)、传递的(Transitive)。
3.2 软件重构技术
最早对重构进行理论研究的Ralon Jahnson这样描述重构:重构是使用各种手段重新整理一个对象设计的过程。目的是为了让设计更加灵活,更可重用。你可能有几个理由来做这件事情.其中效率和可维护性可能是最重要的原因。
Martin Fowler在他的著作《Refactoring: Improving the Design of Existing Code》中这样定义重构:在不改变可观察行为的前提下,对软件内部结构的改变,目的是使它更易于理解并且能够更廉价地进行改变。
软件结构可以因为各种各样的原因而被改变.但只有出于可理解性、可修改、可维护目的的改变才是重构,如性能调优,它往往把代码改得更让人难以理解,虽然它并不改变可观察的行为,所谓保持可观察的行为,就是重构之前软件实现什么功能,之后照样实现什么功能。任何用户,不管是终端用户还是其他的程序员,都不需要知道某些东西发生了变化。
为了论证度量在重构中对人的“直觉”的辅助作用,我们重点研究了两种重构方法。
3.2.1重构方法
移动方法(Move Method):是指把方法m从类A中移到使用此方法最多的类B中,而类A中的方法m则变换成一个简单的委托(delegation),或者完全移去它。
移动属性(Move Attribute):是指把属性a从类A中移到使用此属性最多的类B中,同时修改属性a的所有使用者。
上述两种重构方法都是基于下列使用关系(use relation):相互间大量使用的特性应聚集在同一个类中。而驱使这两种重构方法的“坏味道”:一是某类中定义的方法或属性被其它类过多的使用着;二是某类中定义的方法过多的使用其他类中定义的方法。
3.2.2 坏味道(Bad Smell)
在我们进行重构之前,必须明白“重构什么”和“怎样重构”。这些工作是通过探测代代码中“坏味道”来进行的,Martin Fowler在他的书中引用Kent Beck对“坏味道”隐喻,描述如何识别一种早期的警示信号,它们指示程序代码的某一部分必须重构。虽然Martin Fowler认为在实践中没有一套好的度量方法胜过人的直觉,但是在研究中我们发现部分“坏味道”是可以量化的。这样的“坏味道”有:
弹散式的外科手术(Shotgun Surgery):对系统一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行为通常应当放在同一个类中。
特性的羡慕(Feature Envy):对象的目的就是封装状态以及与这些状态紧密相关的行为。如果一个类的方法频繁用 Get方法存取其他类的状态进行计算,那么就要考虑把行为移到涉及状态数目最多的那个类。
不当的亲密关系(Inappropriate Intimacy):当类过度访问其他类的私有部分,代表这个类有不当的亲密关系。使用移动方法及移动属性来降低亲密关系。
数据类(Data Class ):数据类中除了属性及存取这些属性的Set及Get方法外别无它物。这种类一般多是为其它对象操作。如果其它类中常常使用到Set及Get方法,就要将这些行为以移动方法移到数据类中。
3.2.3 工具支持
虽然可以采用手工方式进行重构,但一般认为采用支持重构的工具进行重构工作是非常必要的。目前,在重构包含的各个方面都有相当数量的支持工具。从工具和它能够提供的支持种类来看,自动化的程度有相当大的差别。诸如Refactoring Browser , XRefactory , jFactor这类的工具提供半自动方法实现重构。一些研究人员提供了实现全自动重构工具的可能性。例如,Guru 能够实现SELF 程序的重建继承层次和重构方法的自动化。当前关于重构工具的一种趋势是将它们直接集成到商业软件开发环境中。例如SmallTalk的VisualWorks、Eclipse 、Together ControlCenter、Intellij IDEA 、Borland JBuilder等等。这些工具的应用的焦点是满足用户对重构的需要。但是这些工具对于在何时、何处需要应用重构几乎没有提供什么支持。Simon提出解决该问题的一些方式,Kataoka指出如何通过使用Daikon工具检测程序不变量的方法自动地应用重构方法。该方法基于对程序运行的行为的动态分析实现,可以将其视为其它方法的补充。
4.课题时间安排
2002.09 ---- 2003.02 调研并阅读相关文献
2003.03 ---- 2003.10 进行理论研究
2003.10 ---- 2003.12 写毕业论文
2004.3 答辩
参考文献
Roberts, F. S., Measurement theory, in Encyclopedia of Mathematics and Its Applications, Vol. 7, Addison-Wesley, 1979.
Krantz, D.H., Luce, R. D., Suppes, P. and Tversky, A. , Foundations of Measurement, Vol.1 : Additive and Polynomial Representations, Academic Press, 1971.
Suppes, P. Krantz, D. H., Luce, R. D and Tversky, A. , Foundations of Measurement, Vol.2: Geometrical, Threshold and Probabilistic Representations, Academic Press, 1989.
Luce, R. D., Krantz, D. H. ,Suppes, P. and Tversky , A. , Foundations of Measurement, Vol.3: Respresentation, Axiomatization and Invariance, Academic Press, 1990.
Roger S. Pressman, Software Engineering: A Practitioner’s Approach (Fifth Edition), Mc Graw Hill, 2001.
Shyam R. Chidamber and Chris F. Kemerer, A Metrics Suite for Object-Oriented Design, IEEE Trans. on SE, Vol. 20, No. 6, June 1994.
Norman E Fenton, Software Metrics: A Rigorous Approach, Chapman&Hall, 1991.
E.J. Weyuker, eva luating Software Complexity Measures, IEEE Trans. Software Eng., September, 1988:1357- 1365.
Pfleeger, Status Report on Software Measurement, IEEE Software, 1997,33-43.
Berard, Metrics for Object-Oriented Software Engineering, an Internet posting on comp. Software-eng, Jauary 28, 1995.
Whitmire, S., Object-Oriented Design Measurement, Wiley, 1997.
Frank Simon, Silvio Löffler, Claus Lewerentz. Distance based cohesion measuring, in proceeding of the 2nd European Software Measurement Conference (FESMA) 99, Technologist Institute Amsterdam, 1999.
James M. Bieman and Linda M. Ott. , Measuring functional cohesion, Technical Report CS-93-109, Michigan Technological University, 1993.
James M. Bieman and Byung-Kyoo, Measuring Design-Level Cohesion, IEEE Transactions on Software Engineering, Vol 24, Nr. 2, February 1998.
Martin Fowler. Refactoring: Improving the design of existing code. Addison Wesley Longman, Inc., Reading, Massachusetts, 1999;
Dave Astels. Refactoring with UML;
Frank Simon, Frank Steinbruckner, Claus Lewerentz. Metrics based refactoring,2001;
Mario Bunge. Treatise on basic philosophy, Volume 3: Ontology I, The furniture of the world”, D. Reidel Publishing Company, Dordrecht-Holland 1977;
Yoshio Kataoka, Michael D.Ernst, Willian G.Griswold and David Notkin. Antomated support for program refactoring using Invariants;
Agile Modeling website, www.agilemodeling.com;
朱鸿、金凌紫,软件质量保障和测试,科学出版社,1997.8
邢大红、曹佳冬、汪和才、刘宗田,软件度量学综述,计算机工程与应用,2001.1
弓惠生。模块内聚性的度量方法,计算机研究与发展,1997,349(8)
吴源俊,软件工程中的度量问题,信息技术与标准化,2002.11
蔡希尧,软件质量的度量问题,计算机工程与科学,1996.1