第6章面向对象方法学引论

第6章面向对象方法学引论
第6章面向对象方法学引论

第6章 面向对象方法学引论 教学提示:本章主要讲述面向对象方法学的优缺点;面向对象的基本概念:对象、类、实例、消息、方法、封装、继承、多态性和重载等;面向对象的软件工程:OOA、OOD、

OOP、OOT;面向对象的建模及对象模型、动态模型、功能模型;面向对象的开发方法。

教学要求:面向对象的基本概念,比较抽象,教学中要注意结合面向对象的高级语言举一些例子来更深刻地领会。本章难点是面向对象的概念及特征和面向对象的模型。掌握面向对象的基本概念及特征,面向对象的建模,面向对象的软件工程。了解面向对象方法学的定义和优点,面向对象的开发方法。

面向对象的软件开发方法在20世纪60年代后期首次提出,经过将近20年这种技术才逐渐得到广泛应用。到了20世纪90年代前半期,面向对象的软件工程方法学已经成为人们在开发软件时首选的范例。今天看来,面向对象技术似乎是最好的软件开发技术

6.1 面向对象方法学概述

面向对象的技术是当前计算机界所关心的重点,是目前软件发展的主流。面向对象的概念来自面向对象的程序设计语言,实际上,面向对象的概念和应用已经超越了程序设计语言,扩展到很宽的范围,如面向对象的数据库系统、面向对象的系统分析与设计、CAD 技术、人工智能以及其他广泛的应用范围。

6.1.1 面向对象方法的发展历程

面向对象的方法的研究正在引起全世界越来越强烈的关注和高度重视,被誉为“研究最新技术的好方法”。针对日趋复杂的软件需求的挑战,软件业界开始崇尚利用面向对象的方法和思想进行软件开发。

与人类发明史上的许多创举不同,面向对象不是瞬间出现的。面向对象不是某个人的突发奇想,而是许多人经历多年研究积累的产物。

面向对象的方法起源于面向对象的程序设计语言。在20世纪60年代中期Simula-67的设计者Dahl和Nygaard 提出对象(object)的概念,在程序设计语言中开始使用数据封装(data encapsulation)的概念。在20世纪70年代,Liskov使用抽象数据类型(ADT)的理论和实现有了重大的进展,奠定了面向对象的基础。Liskov最著名的研究成果是CLU语言,支持隐藏内部数据表示方法。从20世纪70年代起,Xerox公司的 Palo Alto 研究中心经过对Smalltak 72、74连续不断的研究、改革后,在1980年推出了Smalltalk-80,它在系统设计中强调对象概念的统一,引入对象、对象类、方法和实例等概念及术语,采用了动态联编及单继承机制,体现了面向对象方法的许多重要概念,对面向对象方法学的形成和发展起

第6章 面向对象方法学引论 ·123·了重大作用。

与此同时,Bell实验室的B. Stroustrup着手在C语言的基础之上加以扩展,使之成为一个面向对象的语言,定名为C++。由于C语言在80年代已成为通用的开发语言,它不仅可以用于计算机,而且可以用于范围很宽的计算机结构及环境,因此在C语言的基础上扩展而成的C++虽然不是纯粹的面向对象语言,却继承了C的语言构造,易学易用,不需特殊的计算机平台。这些相比于Smalltalk-80明显的优点,受到计算机界的普遍欢迎。许多C++商业版本和工具相继出现,原来阻碍面向对象程序设计语言推广使用的性能价格比问题也顺利地得以解决。所以,C++的问世,促进了面向对象技术的发展。

Java语言与Internet有着直接的关系,它采用了类C++的风格,是一个比较严格的面向对象的语言,并且可以跨平台运行。SUN公司的Java 2的J2ME、J2SE、J2EE不同的标准,使得Java可以应用在任何平台之上。

另外,还有一些其他的面向对象的程序设计语言也在20世纪80年代相继出现,如objective-C、Eiffel、CommonLOOPS等。

许多基于框架(Frame-based)的知识表达系统提供了面向对象的特征;Tertronix和Data General公司提供了面向对象辅助设计和工程系统。O2、ITASCA及ObjectStore等面向对象的数据库系统,日趋成熟并已进入商品化。许多Client/Server数据库开发工具都采用了面向对象的方法与技术,如Borland Internatioal公司的Delphi、Powersoft公司的Power Builder和Informix的New Era等。

在20世纪90年代后期,尽管Grady Booch、Ivar Jacobson及Jim Rumbaugh三人在面向对象领域各有各自的主张,但是他们仍通力合作将面向对象用合理的符号表示产生了统一建模语言(Unified Modeling Language,UML),这个图形化的建模语言既有可视的表达形式,又有严谨的语义支撑。

6.1.2 面向对象方法学的优点

面向对象方法的基本思想是从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式。开发一个软件是为了解决某些问题,这些问题所涉及的业务范围称作该软件的问题域。面向对象方法强调直接以问题域(现实世界)中的事物为中心来思考问题、认识问题,并根据这些事物的本质特征,把它们抽象地表示为系统中的对象,作为系统的基本构成单位,而不是用一些与现实世界中的事物相差较远,并且没有对应关系的其他概念来构造系统。因此,面向对象方法可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。

1. 与人类习惯的思维方法一致

面向对象的软件技术是以对象为核心,用这种技术开发出的软件系统由对象组成。对象是对现实世界实体的正确抽象,它是由描述内部状态表示静态属性的数据以及可以对这些数据施加的操作,封装在一起所构成的统一体。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。

面向对象的设计方法基本原理是,使用现实世界的概念抽象地思考问题从而自然地解决问题。它强调模拟现实世界中的概念而不强调算法,鼓励开发者在绝大部分过程中都应

·123·

软件工程基础教程

·124··124·

用领域的概念去思考。在面向对象的设计方法中,计算机的观点是不重要的,现实世界的模型才是最重要的。面向对象的软件开发过程从始至终都围绕着建立问题域的对象模型来进行,对问题域的自然的分解,确定需要使用的对象和类,建立适当的类等级,在对象之间传递消息实现必要的联系,从而按照人们习惯的思维方式建立起问题领域的模型,模拟客观世界。

面向对象方法学的基本原则是按照人类习惯的思维方法建立问题域的模型,开发出尽可能直观、自然地表现求解方法的软件系统。面向对象的软件系统中广泛使用的对象是对客观世界中实体的抽象。面向对象的软件技术为开发者提供了随着对某个应用系统的认识逐步深入和具体化的过程,而逐步设计和实现该系统的可能性,因为可以先设计出由抽象类构成的系统框架,随着认识深入和具体化再逐步派生出更具体的派生类。这样的开发过程符合人们认识客观世界、解决问题时逐步深化的渐进过程。

2. 稳定性好

传统的软件开发方法以算法为核心,开发过程是基于功能分解和功能分析进行的。当功能需求发生变化时将引起软件结构的整体修改。所以,这种软件系统的稳定性是比较差的。而面向对象方法是基于构造问题领域的对象模型,以对象为中心来构造软件系统的。用对象模拟问题领域中的实体,以对象间的联系刻画实体间的联系。面向对象的软件系统的结构是根据问题领域的模型建立起来的,而不是基于对系统应完成的功能的分解,所以,当对系统的功能需求变化时并不会引起软件结构的整体变化,往往仅需要作一些局部性的修改。因此,以对象为中心构造的软件系统也是比较稳定的。

3. 可重用性好

面向对象方法在类的级别上而不是在各子程序级别上,提高代码重用来改进软件的可重用性。可以通过开发和建立合适的类库进行重用,这种方法实际上是一种新的符合特定需求的非常高层的语言。

实际上对象类是一个足够复杂的有机体,可以作为独立的软件单元从公司中的一个应用移植到另一个应用。

4. 可扩展性

软件的可扩展性简单地描述为“说明域与实现域之间是同构的”,用通俗的话来说就是解决问题的模型应该满足问题的模型。用户的一些小的改变不会导致主要系统灾难性的后果,当修改面向对象代码时很少会引发其他部分产生的莫名其妙的问题。由于面向对象基于更高层次上建立软件单元,它更接近于生活的抽象,因此比传统的技术更容易建立同构。

可扩展性经常和继承性一起使用,用户常在已经声明的主题中增加变量以对系统进行扩展。使用面向对象技术,可以在已有的超类下增加继承子类的方法实现扩展。

5. 可维护性

前面4个特性是可维护性的基础。面向对象的方法可以提高前4个方面的质量,因此能够在以下几个方面降低系统的维护开销。

(1) 可重用性降低了企业整个代码维护的费用。

(2) 可靠性减少了用户的不满意度和对修改问题的抱怨。

第6章 面向对象方法学引论 ·125·

(3) 健壮性确保了软件的可维护性而不至于在桌面上瘫痪。

(4) 可扩展性迎合了用户修改系统的渐近式倾向,因此用户可以不断地对软件寻求更多的较小的修改。

6.1.3 面向对象方法学的不足

面向对象的方法也不是完美的,也有一些不方便的地方。

1. 面向对象需要更关注于需求、分析和设计

和结构化方法类似,如果要构建出符合用户需要的系统,必须了解用户到底需要什么。因此要做出需求分析,然后根据需求的结构进行分析和设计。利用面向对象的方法必须在分析和设计上下功夫。

2. 面向对象需要完全改变每个人的思想

系统现在都是由相互作用的对象组成的,这完全和结构化的方法不同。千万不要低估这两种方法之间巨大的差异。

3. 面向对象需要改变软件开发文化

每个开发人员思想的变化实际上反映了开发文化总体上的变化。每个开发人员都是用新的方法,做更多的分析和设计,与自己的用户进行更多的交流。如果这些变化在你的机构里还没有发生,那么当面向对象引入到开发部门时就会经历巨大的企业文化变迁。

4. 面向对象不仅仅是编程

在改变开发文化的过程中,应更加注重整个系统的开发过程,尤其是分析和实际工作,需要学习如何正确地使用面向对象的方法,这样做起来既不容易也不快。

5. 面向对象的许多优点是长期的

增加重用性和可扩展性有助于减少开发时间和成本,当需要扩展和完善软件系统时面向对象的优点就显示出来了。这意味着有些优点所带来的好处必须等待好几年的时间。

6. 面向对象要求先在培训、教育和工具上投资

软件开发机构必须对开发人员进行培训,要购买面向对象的开发工具、书籍及杂志。这些都需要预先进行一部分投资。这些短期投资和面向对象将带来长期回报。

7. 面向对象技术不能保证能构造出正确的系统

面向对象提供了增加项目成功的可能性,但这仍依靠参与人员的能力。开发人员、用户和管理者每个人都有义务协同工作,营造出适于面向对象开发的一个氛围。

8. 面向对象要求更多的测试工作

面向对象开发本质上就是迭代的,因为可能正在使用对象开发复杂的软件,最终结果可能要花更多的时间来测试。迭代开发需要更侧重于回归测试以及验证老软件在改动后仍能正常工作上。软件越复杂就越需要下力气来验证它。

·125·

软件工程基础教程

·126··126·

9. 面向对象仅是解决方案的一部分

面向对象并不能包含一切事情。不仅要使用计算机辅助软件工程来帮助建模,还需要质量保证活动来确保系统达到用户要求,并且还要制作出方便用户有效使用的系统界面。面向对象不是包治百病的万灵药,它仅是解决方案的一部分。

6.2 面向对象的基本概念

在面向对象的设计方法中,对象和传递消息分别是表现事物及事物间相互联系的概念。类和继承是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。

6.2.1 对象

对象一词应用广泛,难以精确定义,场合不同,含义各异。一般说来,任何事物均看成“对象”,但对于计算机软件来说,则失之过泛。

在这里,对象是一个实体,它能够保存一个状态(或称信息或数据),并且能提供一系列操作(或称行为),这些操作或能检查或能影响对象的状态。

对象能够表示现实或抽象的事物,具有良好定义的责任和良好定义的行为,以及良好定义的接口。对象通常不是太复杂或太大。一个对象可以由多个对象组成,并且与其他对象具有松散耦合。

对象具有封装性(encapsulation)。对象将数据及行为封装在一起,并且具有信息隐藏的能力,也就是说将其内部结构隐藏起来。具体地说,外界不能直接修改对象的状态,只有通过向该对象发送消息(message)来对它施加影响。对象隐藏了其中的数据及操作的实现方法,对外可见的只是该对象所提供的操作的接口,对象将接口从实现中分离。但在某些面向对象程序设计语言中,信息隐藏是有权限的,如C++。

通过封装,可以防止对封装数据未经授权的访问,有助于保证数据的完整性。隐藏起来的执行细节,对其他对象是透明的,因此内部细节的改动不影响向其发送消息的对象。

对象具有自治性(autonomy)。对象具有独立的计算能力:给定一定的输入,经过状态转换,对象能产生输出,说明它具有计算能力。对象自身的状态变化不是直接受外界干预的,外界只有通过发送消息对其产生影响,因此对象能够提供服务。

对象具有通信性。对象具有与其他对象通信的能力,具体地说就是对象能接收其他对象发来的消息,同时也能向其他对象发送消息。通信性反映了不同对象间的联系,通过这种联系,若干对象可以协同完成某项任务。

对象具有被动性。对象的存在和状态转换都是由来自外界的某种刺激(stimulus)引发的,这种刺激就是消息。对象的存在是由外界决定的,而对象的状态转换则是在它接收到某种消息后产生的。

对象具有暂存性。有两层含义:一是指对象的存在可以动态地引发,不是在系统运行一开始就存在二是对象可随时消亡,不是必须存在到系统运行结束。虽然在系统运行过程中自始至终保存某些对象,但从对象的本质或作用来说,它具有暂存性。

对象可具有持久性(persistence)。持久对象不随着创建它的进程结束而消亡,并且在外

第6章 面向对象方法学引论 ·127·存中存储。对象的持久性可以从两个方面理解。一个方面是应用系统急需管理的客观存在的对象,如学生等。这方面的持久对象主要靠面向对象的数据库管理系统进行管理。另一方面,在面向对象的应用中,经常需要将暂存对象(内存中的对象)转换成持久对象(在外存中存储),应用需要时,再将持久对象转换成暂存对象。

在面向对象程序设计语言中,对象由若干属性值及方法组成。对象的属性和方法称作对象的特性(property)。属性值即对象的状态,方法即对象的行为。属性在内部实际上是一组变量。方法是一组函数或过程。在smalltalk中,影响对象属性值的唯一方法是可以直接访问对象的属性及方法。在C++中,属性称作数据成员,方法称作成员函数。

6.2.2 类和实例

1. 类

现实世界中存在的客观事物有些是彼此相似的,例如,张三、李四、王五等的基本特征相似,都是黄皮肤、黑头发、黑眼睛,人们把他们统称为“中国人”。人类习惯于把有相似特征的事物归为一类,分类是人类认识客观世界的基本方法。

在面向对象的方法中,对象按照不同的性质划分为不同的类。同类对象在数据和操作性质方面具有共性。在面向对象程序设计语言中,程序由一个或多个类组成。在程序运行过程中,根据需要创建类的对象(即其实例),因此类是静态概念,对象是动态概念。类是对象之上的抽象,有了类之后,对象则是类的具体化,是类的实例。

类的定义是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。具体来说,类由方法和数据集成,它是关于对象性质的描述,包括外部特性和内部实现两个方面。

一个类的上层可以有超类,下层可以有子类,形成一种层次结构。这种层次结构的一个重要特点是继承性,一个类继承其超类的全部描述。这种继承具有传递性,一个类实际上继承了层次结构中在其上面的所有类的全部描述,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上面所有类描述的全部特性。在类的层次结构中,一个类可以有多个子类,也可以有多个超类。因此,一个类可以直接继承多个类,这种继承方式称为多重继承。如果限制一个类至多只能有一个超类,则一个类至多只能直接继承一个类,这种继承方式称为单重或简单继承。在简单继承情况下,类的层次结构为树结构,而多重继承是网状结构。

类分为一般类和特殊类,它们的定义是:如果类A具有类B的全部属性和全部服务,而且具有自己特有的某些属性或服务,则A叫做B的特殊类,B叫做A的一般类。

把一组对象的共同特性加以抽象并存储在一个类中的能力,是面向对象方法最重要的一点,是否建立了一个丰富的类库,是衡量一个面向对象程序设计语言成熟与否的重要标志。

在面向对象程序设计语言中,类的作用有两个:一是作为对象的描述机制,刻画一组对象的公共属性和行为;二是作为程序的基本单位,它是支持模块化设计的设施,并且类上的分类关系是模块划分的规范标准。

2. 类和型的区别

型(type)的说明是指概念上、逻辑上的问题。数据的值都有型。一个类指一个特定的抽

·127·

软件工程基础教程

·128··128·

象数据类型实现模板,对象具有类。型是定义在值上的一个谓词布尔函数,而不能用在限制一个可能的参数或表征某一个结果上,型通过一个公共的接口对对象进行分类。如果一个型定义了对象是如何定义和实现的,那么将通过定义新的型来实现应用。一个型包括:

(1) 一个操作接口集合;

(2) 操作的代码;

(3) 定义对象表达的数据结构。

一个类是一个能够实例化出多个具有同样行为的对象的设计部分,一个对象是一个类的实例,同类型相反,类通过一个公共的实现来区分对象。有些人认为类和型关系密切并可以交换使用,也有一些人认为类和型完全不同,实际上,上述两种看法都是不对的:类具有一个外部的意义,指明适合于型的对象集合;型则是一个对象集合特征的内部定义。

3. 类的实例

在面向对象的系统中,每个对象都属于一个类,属于某个类的对象称为该类的一个实例,类和对象间具有instance-of 关系。一个实例是从一个类创建而来的对象,类描述了这个实例的行为(方法)及结构(属性)。实例的当前状态由在该实例执行的操作来定义。类是静态的,实例对象是动态的。

实例的行为和属性由其所在的类来定义,每个实例具有一个对象标识。许多不同的实例可以由某一个类所创造,每个实例可由该类上定义的操作(方法)来操纵,不同的实例可以由不同的操作序列来操纵,结果会得到不同的状态。如果这些实例严格地用同样的操作方法进行操纵,必定得到相同的状态。

在某些环境下,我们也认为类本身也是一个对象,这个特殊的对象也有其属性和方法,称为类属性和类方法(普通对象的属性和方法称作实例属性和实例方法)。我们认为任何一个对象都是某个类的对象,因此如果将类看作一个对象,该类必定是另一个特殊类的实例,这个特殊类称作元类(metaclass)。

在面向对象的程序设计语言中,类的实例既可静态地产生也可动态地产生。静态实例化指在程序编译时刻即产生对象,存活于程序运行期间。动态实例化指对象的创建运行时刻分配对象的存储空间及对象标识,在运行时刻删除该对象,回收所占空间。Java 语言采用动态实例化方法。要创建一个对象,必须使用关键字new 来创建一个动态的实例。

6.2.3 消息和方法

1. 消息

对象通过它对外提供的服务在系统中发挥自己的作用。当系统中的其他对象(或其他系统成分)请求这个对象执行某个服务时,它就响应这个请求,完成服务所要求的职责。在面向对象的方法中把面向对象发出的服务请求称作消息。消息用来请求对象处理或回答某些信息的要求,消息统一了数据流和控制流。程序的执行是靠在对象间传递消息来完成的。

消息就是向对象发出的服务请求,它应含有提供服务的对象标识、服务标识、输入信息和回答信息。

消息的接收者是提供服务的对象。在设计时,它对外提供的每个服务应规定消息的格式,这种规定称作消息协议。消息的发送者是要求提供服务的对象或其他系统成分(在不要

第6章 面向对象方法学引论 ·129·求完全对象化的语言中允许有不属于任何对象的成分,如C++程序的main函数)。在它的每个发送点上需要写出一个完整的消息,其内容包括接收者(对象标识)、服务标识和符合消息协议要求的参数。消息中只包含发送者的要求,它指示接收者要完成哪些处理,但并不告诉接收者应该怎样完成这些处理。

例如,MyCircle是一个半径4cm、圆心位于(100,200)的Circle类的对象,也就是Circle类的一个实例,当要求它以绿色在屏幕上显示自己时,在C++语言中应该向它发出下列消息:

MyCircle.Show(GREEN);

其中MyCircle是接收消息的对象的名字,Show是消息选择符(即消息名),圆括号内的GREEN 是消息的变元。当MyCircle接收到这个消息后,将执行在Circle类中所定义的Show操作。

2. 方法(method)

方法(method)也称作行为(behavior),指定义于某一特定类上的操作与法则。具有同类的对象只可为该类的方法所操作,换言之,这组方法表达了该类对象的动态性质,而对于其他类的对象可能无意义,乃至非法。

把所有对象分成各种对象类,每个对象类都有一组所谓的方法,它们实际上是类对象上的各种操作。图6.1给出了对象的分解图。当一个面向对象的程序运行时,一般要做三件事:首先,根据需要创建对象;其次,当程序处理信息或响应来自用户的输入时,要从一个对象传递消息到另一对象(或从用户到对象);最后,若不再需要该对象时,应删除它并回收其所占用的存储单元。

对象

数据

方法

图6.1 对象的分解图

由此可见,面向对象的设计方法放弃了传统语言中控制结构的概念,以往的一切控制结构的功能都可以通过对象及其相互间传递消息来实现。

6.3 面向对象的基本特征

在面向对象的设计方法中,对象、类、消息和方法的程序设计范式的基本点在于对象的封装性和继承性。通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态绑定和实体的多态性,从而构成了面向对象的各种特征。

6.3.1 继承性(inheritance)

继承是一种使用户得以在一个类的基础上建立新的类的技术。新的类自动继承旧类的

·129·

软件工程基础教程

·130··130·

属性和行为特征,并可具备某些附加的特征或某些限制。新类称作旧类的子类,旧类称作新类的超类,继承能有效地支持软件构件的重用,使得当需要在系统中增加新的特征时,所需新代码最少,并且当继承和多态、动态联编结合使用时,为修改系统所需变动的原代码最少。继承机制的强有力之处还在于它允许程序设计人员可重用一个未必完全符合要求的类,允许对该类进行修改而不至于在该类的其他部分引起有害的副作用。

继承性是面向对象程序设计语言不同于其他语言的最主要特点,是其他语言所没有的。正因为继承机制才使得子类的对象也是超类的对象,所以所有发给超类对象的消息,子类对象也可以接收。例如类“cycle ”是类“shape ”的子类,所以一个cycle 对象可以接收发给shape 对象的消息。

继承机制是组织构造和重用类的一种工具,如果没有继承概念的支持,则所有的类都像一盘散沙,分别是一个个独立的实体,每次软件开发仍要从“一无所有”开始,这时,由于类开发者在构造方法时仍然各自为政,使得类和类之间没有什么联系,即使有,也只是程序员之间的某种约定的结果。

由于继承机制是由相关的关系来组织事物的,可以减少我们对相似事物运行说明和记

忆的规模,所以它为我们提供了一种有效的简化手段。

彼此独立开发的事物常常是不一致的,其中会有许多信息要求人们去记忆,这当然容易出差错。继承是面向对象语言中功能最强大、最有代表性的特性。首先,继承使新的类变得简洁明了;其次,通过继承可以重复使用和扩展那些经过测试的已有的类,实现重用。最后,是利用继承可以增强处理的一致性。

子类和继承是两个不可分割的概念,继承是在类、子类以及对象间共享数据和方法的一种重用性(reusability)机制。在设计新类时,只需考虑与已存在的类所不同的部分,可以继承存在的类的内容作为自己的内容。已存在的类通常称作超类,新的类通常称作子类。子类不仅可以继承超类的方法,也可以继承超类的属性。如果超类中的某些方法不适合于子类,则可以重置这些方法,即重写方法新的实现部分并予以存储。

如果类C 能使用类B 中的方法及属性,称B 是C 的超类(superclass),C 是B 的子类(subclass),也称类C 继承类B ,如图6.2所示。

图6.2 继承

类间的继承关系是可以传递的:如果C 的超类是B ,B 的超类是A ,则A 是C 的间接超类,C 是A 的间接子类。而B 是C 的直接超类,C 是B 的直接子类。

继承可分为单继承和多继承,如果一个类只有一个直接超类,则这种继承叫做单继承;如果一个类有多于一个的直接超类,这种继承叫做多继承。

A

B C B

C

第6章 面向对象方法学引论 ·131·多继承的主要缺点是降低了类继承层次的易懂性。特别是当两个超类都有同名的方法,但定义不同时,将引起很大的问题。必须定义一个新的方法或显式地选择一个已经存在的定义。在大多数支持多继承的面向对象的程序设计语言中,用户被迫重新定义方法名以使方法名唯一。这是最容易被接受的方案,一种特殊情况是同一方法存在于两个超类中,而这两个超类又具有同一个超类,这种继承称作重复继承(repeated inheritance)即发生重名冲突。

在多继承中必须解决重复继承问题,解决方法随着语言的不同而不同。一种途径是发现这种冲突时发出时的出错信号,并要求子类对冲突的方法予以显示指明,指明方法是从哪个超类中继承来的。

6.3.2 封装性(encapsulation)

在面向对象的方法中,所有信息都存储在对象中,即其数据及行为都封装在对象中。影响对象的唯一方式是执行它所从属的类的方法即执行作用于其上的操作。这就是信息隐藏(information hiding),也就是说将其内部结构从其环境中隐藏起来。若要对对象的数据进行读写,必须将消息传递给相应对象,得到消息的对象调用其相应的方法对其数据进行读写。因此,当使用对象时,不必知道对象的属性及行为在内部是如何表示和实现的,只需知道它提供了哪些方法(操作)即可。

封装是一种信息隐蔽技术,用户只能见到对象封装界面上的信息,对象内部对用户来说是隐蔽的。

封装是面向对象方法的一个重要原则,它有两个含义:第一个含义是,把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象);第二个含义也称作信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界,只保留有限的对外接口使之与外部发生联系。

封装的目的在于将对象的使用者和对象的设计者分开,使用者不必知道行为实际的细节,只须用设计者提供的消息来访问该对象。

封装的定义为:

(1) 一个清楚的边界,所有对象的内部软件的范围被限定在这个边界内;

(2) 一个接口,这个接口描述这个对象和其他对象之间相互的作用;

(3) 受保护的内部实现,这个实现给出了由软件对象提供的功能的细节,这些只能通过定义这个对象的类所提供的方法进行访问。

封装的概念和类说明有关,但它同样提供如何将一个问题解的各个组件组装在一起的求精过程。封装的基本单位是对象,这个对象的性质由它的类说明来描述,具有同样类的其他对象共享这个性质。对象用作封装的说法比说一个类表示封装的说法更严格。借助对象封装这种定义,一个类的每一个实例在一个问题求解中是一个单独的封装。

6.3.3 多态性(polymorphism)和重载(over loading)

在收到消息时对象要予以响应,不同的对象收到同一消息可以产生完全不同的结果,这一现象叫做多态。

类的继承与多态结合后,将进一步增强软件的重用性。多态主要包括如下内容。

·131·

软件工程基础教程

·132··132·

(1) 运算符重载: 同一运算符可用于不同的变量类型,称作运算符重载。例如,“加”运算既可用来加两个整数,也可实现浮点数相加、复数相加(由程序定义复数)、复数与整数相加或与浮点数相加等。在这些情况下,“同样”的操作对于不同的参数类型保持运算功能的透明性。

(2) 即席多态(ad hoc polymorphism):即席多态也称操作名重载。同一操作名可作用于不同对象上并产生不同的结果。例如“OPEN ”操作既可作用于“数据流”也可作用于“窗口”等不同对象上。这种多态很有用,但若使用不当也会产生错误结果。因此,程序员应选择避免发生误解释的、意义明确的操作名。

(3) 类属软件(generic software)的重用:类的继承与多态密切相关,作用于超类实例的方法同样也可以作用于其子类的实例。超类的方法不仅可由已存在的子类所重用,而且还可以由新创建的子类所重用。

另外,通过从超类中抽取出共性,利用类继承机制实现软件重用。类属对象类(generic object class)通过对类仅作部分描述并且使参数作为一种未知的东西来实现软件重用。这些参数通常是类属类的实例可以操纵的类的对象。通常有两种类属对象:一类是同类的“容器(container)”对象,例如数组及列表,可以对任何种类对象进行操作。另一种是“工具(tool)”对象,例如排序器或编辑器,只能作用于某些种类的对象,其参数必须加以约束来指明这些参数所需要的超类。排序器仅能对有比较操作的对象进行排序,排序对象能利用“总体排序”的类属类的多态,并将操作平等地施加于满足约束的对象中。

6.4 面向对象的软件工程

传统的软件工程方法学曾经给软件产业带来过巨大的进步,缓解了软件危机,使用这种方法学开发的许多中、小规模的软件项目都获得了一定的成功。但人们也发现当把这种方法学应用于大型软件产品的开发时,似乎很少能取得成功。

在20世纪60年代后期出现的面向对象的编程语言SIMULA-67中首次引入了类的对象概念。从此,人们逐渐开始注重面向对象分析和设计的研究,逐步形成了面向对象方法学。20世纪90年代,面向对象方法学已经成为人们在开发软件时首选的范型。面向对象的技术已成为当前最好的软件开发技术。

随着编程语言由低级向高级的发展,它与自然语言之间的鸿沟在逐渐变窄。开发人员从对问题域产生正确的认识,到用一种编程语言把这些认识描述出来,在这一过程中他所付出的劳动不断减少,由机器代替人完成的工作则在增多。

在软件开发过程中,要求人们对问题域的理解,比人们日常生活中对它的理解更深刻、更准确,这需要许多以软件专业知识为背景的思维方法。所有这些问题都是软件工程学所要解决的。

软件开发是对问题域的认识和描述,软件工程学的作用从认识事物方面看,它在分析阶段提供了一些对问题域的分析、认识方法。从描述事物方面看,它在分析和设计阶段提供了一些从问题域逐步过渡到编程语言的描述手段。这如同在语言的鸿沟上铺设了一些平坦的路段。但是在传统的软件工程方法中,由于软件工程各阶段表示方法不连续等原因,

第6章 面向对象方法学引论 ·133·

·133·

并没有完全填平语言之间的鸿沟,如图6.3所示。而在面向对象的软件工程方法中,从面向对象的分析到面向对象的设计,再到面向对象的编程、面向对象的测试都是紧密衔接的,从而填平了语言之间的鸿沟,如图6.4所示。

面向对象的软件工程方法是面向对象方法在软件工程领域的全面运用,它包括面向对象的分析(OOA)、面向对象的设计(OOD)、面向对象的编程(OOP)、面向对象的测试(OOT)和面向对象的维护等主要内容。 图6.3 传统的软件工程方法 图6.4 面向对象的软件工程方法

1. 面向对象的分析

OOA 强调直接针对问题域中客观存在的各种事物建立OOA 模型中的对象。用对象的属性和服务分别描述事物的静态特征和行为。问题域有哪些值得考虑的事物,OOA 模型中就有哪些对象,而且对象及其服务的命名都强调与客观事物一致。另外,OOA 模型也保留了问题域中事物之间的关系。把具有相同属性和相同服务的对象归结为一类,用一般/特殊结构(又称分类结构)描述一般类与特殊类之间的关系(即继承关系)。用整体/部分结构(又称组装结构)描述事物间的组成关系,用实例连接和消息连接表示事物之间的静态联系和动态联系。静态联系是指一个对象的属性与另一对象属性有关,动态联系是指一个对象的行为与另一对象行为有关。

可以看到,无论是对问题域中的单个事物,还是对各个事物之间的关系,OOA 模型都保留着它们的原貌,没有转换、扭曲,也没有重新组合,所以OOA 模型能够很好地映射问题域。OOA 对问题域的观察、分析和认识是很直接的,对问题域的描述也是很直接的,它所采用的概念及术语与问题域中的事物保持了最大限度的一致,不存在语言上的鸿沟。

2. 面向对象的设计

OOA 与OOD 的职责划分是: OOA 针对问题域运用面向对象的方法,建立一个反映问题域的OOA 模型,不考虑与系统实现有关的因素(包括编程语言、图形用户界面、数据库等),从而使OOA 模型独立于具体的实现。OOD 则是针对系统的一个具体的实现运用面向对象的方法。其中包括两方面的工作,一是把OOA 模型直接搬到OOD(不经过转换,仅

问题域

需要分析 总体设计 详细设计 编程 测试 计算机 计算机 面向对象

测试

面向对象

编程

面向对象

设计

面向对象

分析

问题域

软件工程基础教程

·134··134·

作某些必要的修改和调整),作为OOD 的一个部分;二是针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。这些部分与OOA 采用相同的表示法和模型结构。

OOA 与OOD 采用一致的表示法是面向对象的分析与设计优于传统的软件工程方法的重要因素之一。这使得从OOA 到OOD 不存在转换,只需局部的修改或调整,并增加几个与实现有关的独立部分。因此OOA 与OOD 之间不存在传统方法中分析与设计之间的鸿沟,两者能够紧密衔接,大大降低了从OOA 过渡到OOD 的难度、工作量和出错率。

3. 面向对象的编程

面向对象的编程又称作面向对象的实现(OOI)。在OOA -OOD -OOP 这一软件工程的过程系列中,OOP 的分工比较简单,认识问题域与设计系统成分的工作已经在OOA 和OOD 阶段完成,OOP 的工作就是用一种面向对象的编程语言把OOD 模型的每个成分书写出来。

理想的面向对象的开发规范应要求在OOA 和OOD 阶段对系统需要设立的每个对象类及其内部构成(属性和服务)与外部关系(结构和静态、动态联系)都达到透彻的认识和清晰的描述,而不是把许多问题遗留给程序员去重新思考。程序员需要动脑筋的工作主要是:用具体的数据结构来定义对象的属性,用具体的语句来实现服务流程图所表示的算法。

4. 面向对象的测试

面向对象的测试是指,对于用面向对象的技术开发的软件,在测试过程中继续运用面向对象的技术,进行以对象概念为中心的软件测试。

采用技术开发的软件含有大量的概念、原则及技术机制有关的语法与语义信息。在测试过程中发掘并利用这些信息,继续运用面向对象方法的概念与原则来组织测试,可以更准确地发现程序错误并提高测试效率。主要原因是:在用OOPL(面向对象的编程语言)编写的程序中,对象的封装性使对象成为一个独立的程序单位,只通过有限的接口与外部发生关系,从而大大减少了错误的影响范围。OOT 以对象的类作为基本测试单位,查错范围主要是类定义之内的属性和服务,以及有限的对外接口(消息)所涉及的部分。有利于OOT 的另一个因素是对象的继承性,在对父类测试完成之后,子类的测试重点只是那些新定义的属性和服务。

对于用OOA 和OOD 建立模型并由OOPL 编程的软件,OOT 可以发挥更强的作用,通过捕捉OOA/OOD 模型信息,检查程序与模型不匹配的错误。这一点是传统的软件工程方法难以达到的。

5. 面向对象的软件维护

软件维护的最大难点在于人们对软件的理解过程中所遇到的障碍。维护人员往往不是当初的开发人员,读懂并正确地理解由别人开发的软件是件困难的事情。在用传统的软件工程方法开发的软件中,各个阶段的文档表示不一致,程序不能很好地映射问题域,从而使维护工作困难重重。

面向对象的软件工程方法为改进软件维护提供了有效的途径。程序与问题域一致,各个阶段的表示一致,从而大大降低了理解的难度。无论是发现了程序中的错误而逆向追溯到问题域,还是需求发生了变化而从问题域正向地追踪到程序,道路都是比较平坦的。面

第6章 面向对象方法学引论 ·135·向对象方法可提高软件维护效率的另一个重要原因是将系统中最容易变化的因素(功能)作为对象的服务封装在对象内部,对象的封装性使一个对象的修改对其他影响小,从而避免了波动效应。

6.5 面向对象的建模

我们在解决问题之前首先要理解所要解决的问题,对问题理解得越透彻,就越容易解决它。为了更好地理解问题,人们常常采用建立问题模型的方法。

6.5.1 面向对象的建模概述

所谓模型,就是为了理解事物而对事物做出的一种抽象,是对事物的一种无歧义的书面描述。通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。更进一步讲,模型是一种思考工具,利用这种工具可以把知识规范地表示出来。

模型可以帮助我们思考问题、定义术语、在选择术语时做出适当的假设,并且可以帮助我们保持定义和假设的一致性。

为了开发复杂的软件系统,系统分析员应该从不同角度抽象出目标系统的特性,使用精确的表示方法构造系统的模型,验证模型是否满足用户对目标系统的需求,并在设计过程中逐渐把和实现有关的细节加进模型中,直至最终用程序实现模型。对于那些因过分复杂而不能直接理解的系统,特别需要建立模型,建模的目的主要是为了减少复杂性。人的头脑每次只能处理一定数量的信息,模型通过把系统的重要部分分解成人的头脑一次能处理的若干个子部分,从而减少系统的复杂程度。

通常,通过快速建立原型,让用户和领域专家经过亲身体验,对系统模型进行更有效的审查。模型常常会经过多次必要的修改,通过不断改正错误的或不全面的认识,最终,软件开发人员对问题有了透彻的理解,从而为后续的开发工作奠定了坚实基础。

用面向对象方法成功地开发软件的关键,同样是对问题域的理解。面向对象方法基本的原则,是按照人们习惯的思维方式,用面向对象观点建立问题域的模型,开发出尽可能自然地表现求解方法的软件。

面向对象的建模不仅仅是新的编程语言的汇总,而是一种新的思维方式,一种关于计算和信息结构化的新思维。面向对象的建模,把系统看做是相互协作的对象,这些对象是结构和行为的封装,都属于某个类,那些类具有某种层次化的结构。系统的所有功能通过对象之间相互发送消息来获得。面向对象的建模可以视作一个包含以下元素的概念框架:抽象、封装、模块化、层次、分类、并行、稳定、可重用和可扩展性。

面向对象的建模的出现并不能算是一场计算革命。更恰当地讲,它是面向过程和严格数据驱动的软件开发方法的渐进演变结果。软件开发的新方法受到来自两个方面的推动:编程语言的发展和日趋复杂的问题域的需求驱动。尽管在实际中分析和设计在编程阶段之前进行,但从发展历史看却是编程语言的革新带来设计和分析技术的改变。同样,语言的演变也是对计算机体系的增强和需求的日益复杂的自然响应。

·135·

软件工程基础教程

·136··136·

用面向对象方法开发软件,通常需要建立3种形式的模型.它们分别是描述系统数据结构的对象模型、描述系统控制结构的动态模型和描述系统功能的功能模型。这3种模型都涉及到数据、控制和操作等共同的概念,只不过每种模型描述的侧重点不同。这3种模型从3个不同但又密切相关的角度模拟目标系统,各自从不同侧面反映了系统的实质性内容,综合起来则全面地反映了对目标系统的需求。一个典型的软件系统综合了上述3方面内容:它使用数据结构(对象模型),执行操作(动态模型),并且完成效据值的变化 (功能模型)。

为了全面地理解问题域,对任何大系统来说,上述3种模型都是必不可少的。当然,在不同的应用问题中,这3种模型的相对重要程度会有所不同,但是,用面向对象方法开发软件,在任何情况下,对象模型始终都是最重要、最基本、最核心的。在整个开发过程中,3种模型一直都在发展、完善。在面向对象分析过程中,构造出完全独立于实现的应用域模型;在面向对象设计过程中,把求解域的结构逐渐加入到模型中;在实现阶段,把应用域和求解域的结构都编成程序代码并进行严格的测试验证。

6.5.2 对象模型

对象模型表示静态的、结构化的系统的“数据”性质。它是对模拟客观世界实体的对象以及对象彼此间的关系的映射,描述了系统的静态结构。面向对象方法强调围绕对象而不是围绕功能来构造系统。对象模型为建立动态模型和功能模型,提供了实质性的框架。

在建立对象模型时,我们的目标是从客观世界中提炼出对具体应用有价值的概念。 为了建立对象模型,需要定义一组图形符号,并且规定一组组织这些符号以表示特定语义的规则。一些著名的软件工程专家在提出自己的面向对象方法的同时,也提出了自己的建模语言。但是,面向对象方法的用户并不了解不同建模语言的优缺点,很难在实际工作中根据应用的特点选择合适的建模语言,而且不同建模语言之间存在的细微差别也极大地妨碍了用户之间的交流。面向对象方法发展的现实,要求在精心比较不同建模语言的优缺点和总结面向对象技术应用经验的基础上,把建模语言统一起来。1997年11月,国际对象管理组织OMG 批准UML 1.1作为基于面向对象技术的标准建模语言,关于UML 语言将在第7章中详细讲述。

6.5.3 动态模型

动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。

一旦建立起对象模型之后,就需要考察对象的动态行为。所有对象都具有自己的生命周期(或称为运行周期)。对一个对象来说,生命周期由许多阶段组成,在每个特定阶段中,都有适合该对象的一组运行规律和行为规则,用以规范该对象的行为。生命周期中的阶段也就是对象的状态。所谓状态,是对对象属性值的一种抽象。当然,在定义状态时应该忽略那些不影响对象行为的属性。各对象之间相互触发(即作用),就形成了一系列的状态变化。我们把一个触发行为称作一个事件。对象对事件的响应,取决于接受该触发的对象当时所处的状态,响应包括改变自己的状态或者又形成一个新的触发行为。

通常,用状态图来描绘对象的状态、触发状态转换的事件以及对象的行为(对事件的

第6章 面向对象方法学引论 ·137·响应)。

每个类的动态行为用一张状态图来描绘。各个类的状态图通过共享事件合并起来,从而构成系统的动态模型。也就是说,动态模型是基于事件共享而互相关联的一组状态图的集合。

6.5.4 功能模型

功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求。

通常,功能模型由一组数据流图组成。在面向对象方法学中,数据流图远不如在结构分析、设计方法中那样重要。一般说来,与对象模型和动态模型比较起来,数据流图并没有增加新的信息,但是,建立功能模型有助于软件开发人员更深入地理解问题域,改进和完善自己的设计。因此,不能完全忽视功能模型的作用。

UML提供的用例图也是进行需求分析和建立功能模型的强有力工具。在UML中,把用用例图建立起来的系统模型称为用例模型。

面向对象建模技术所建立的3种模型,分别从3个不同侧面描述了所要开发的系统。

这3种模型相互补充、相互配合,使得我们对系统的认识更加全面:功能模型指明了系统应该“做什么”;动态模型明确规定了什么时候(即在何种状态下接受了什么事件的触发) 做;对象模型则定义了做事情的实体。

在面向对象方法学中,对象模型是最基本最重要的,它为其他两种模型奠定了基础,我们依靠对象模型完成3种模型的集成。下面扼要地叙述三种模型之间的关系。

(1) 针对每个类建立的动态模型,描述了类实例的生命周期或运行周期。

(2) 状态转换驱使行为发生,这些行为在数据流图中被映射成处理,它们同时与对象模型中的服务相对应。

(3) 功能模型中的处理(或用例)对应于对象模型中的类所提供的服务。通常,复杂的处理(或用例)对应于复杂对象提供的服务,简单的处理(或用例)对应于更基本的对象提供的服务。有时一个处理对应多个服务,也有—个服务对应多个处理的时候。

(4) 数据流图中的数据存储,以及数据的源点/终点,通常是对象模型中的对象。

(5) 数据流图中的数据流,住往是对象模型中的对象的属性值,也可能是整个对象。

(6) 用例图中的行为者,可能是对象模型中的对象。

(7) 功能模型中的处理(或用例)可能产生动态模型中的事件。

(8) 对象模型描述了数据流图中的数据流、数据存储以及数据源点/终点的结构。

6.6 面向对象的开发方法

20世纪80年代末以来,随着面向对象技术成为研究的热点,出现了几十种支持软件开发的面向对象方法。其中,Booch,Coad/Yourdon、OMT和Jacobson的方法在面向对象软件开发界得到了广泛的认可。特别值得一提的是统一建模语言UML(Unified Modeling Language),该方法结合了Booch、OMT和Jacobson方法的优点,统一了符号体系,并从其他方法和工程实践中吸收了许多经过实际检验的概念和技术。

面向对象方法都支持三种基本的活动:识别对象和类,描述对象和类之间的关系,以

·137·

软件工程基础教程

·138··138·

及通过描述每个类的功能定义对象的行为。

6.6.1 Booch 方法

Booch 方法是面向对象开发方法的倡导者。Booch 认为软件开发是一个螺旋上升的过程,上升的每个周期有固定的步骤。首先发现应用领域的对象和类,然后确定其含义,找出类之间的关系,说明界面和实现。这些步骤完成之后,又开始寻找新的对象和类等。

Booch 方法的过程包括以下步骤:

(1) 在给定的抽象层次上识别类和对象;

(2) 识别这些对象和类的语义;

(3) 识别这些类和对象之间的关系;

(4) 实现类和对象。

这4种活动不仅仅是一个简单的步骤序列,而是对系统的逻辑和物理视图不断细化的迭代和渐增的开发过程。

类和对象的识别包括找出问题空间中关键的抽象和产生动态行为的重要机制。

开发人员可以通过研究问题域的术语发现关键的抽象。语义的识别主要是建立前一阶段识别出的类和对象的含义。开发人员确定类的行为(即方法)和类及对象之间的互相作用(即行为的规范描述)。该阶段利用状态转移图描述对象的状态的模型,利用时态图(系统中的时态约束)和对象图(对象之间的互相作用)描述行为模型。

在关系识别阶段描述静态和动态关系模型。这些关系包括使用、实例化、继承、关联和聚集等。类和对象之间的可见性也在此时确定。

在类和对象的实现阶段要考虑如何用选定的编程语言实现,如何将类和对象组织成 模块。

在面向对象的设计方法中,Booch 强调基于类和对象的系统逻辑视图与基于模块和进程的系统物理视图之间的区别,还区别了系统的静态和动态模型。然而,他的方法偏向于系统的静态描述,对动态描述支持较少。

Booch 方法的力量在于其丰富的符号体系,包括:

(1) 类图(类结构-静态视图);

(2) 对象图(对象结构-静态视图);

(3) 状态转移图(类结构-动态视图);

(4) 时态图(对象结构-动态视图);

(5) 模块图(模块体系结构);

(6) 进程图(进程体系结构)。

用于类和对象建模的符号体系使用注释和不同的图符(如不同的箭头)来表达详细的信息。Booch 建议在设计的初期可以用符号体系的一个子集,随后不断添加细节。对每一个符号体系还有一个文本的形式,由每一个主要结构的描述模板组成。符号体系由大量的图符定义。但是,其语法和语义并没有严格的定义。

6.6.2 Coad 方法

Coad 方法是1989年Coad 和Yourdon 提出的面向对象的开发方法,该方法严格区分了

第6章 面向对象方法学引论 ·139·面向对象分析(OOA)和面向对象设计(OOD)。该方法利用5个层次和活动定义记录系统行为、输入和输出。这5个层次的活动包括:

(1) 发现类及对象。描述如何发现类及对象。从应用领域开始识别类及对象,形成整个应用的基础,然后据此分析系统的责任。

(2) 识别结构。该阶段分为两个步骤。第一,识别一般/特殊结构,该结构捕获了识别出的类的层次结构;第二,识别整体/部分结构,该结构用来表示一个对象如何成为另一个对象的一部分,以及多个对象如何组装成更大的对象。

(3) 定义主题。主题由一组类及对象组成,用于将类及对象模型划分为同一内容、较大的单位,便于理解。

(4) 定义属性。其中包括定义类的实例(对象)之间的实例连接。

(5) 定义服务。其中包括定义对象之间的消息连接。

在面向对象分析阶段,经过5个层次的活动后的结果是一个分成5个层次的问题域模型,包括主题、类及对象、结构、属性和服务5个层次,由类及对象图表示。5个层次活动的顺序并不重要。

面向对象设计模型需要进一步区分以下4个部分:

(1) 问题域部分(PDC),面向对象分析的结果直接放入该部分;

(2) 人机交互部分(HIC),这部分的活动包括对用户分类、描述人机交互的脚本、设计命令层次结构、设计详细的交互、生成用户界面的原型、定义HIC类;

(3) 任务管理部分(TMC),这部分的活动包括识别任务(进程)、任务所提供的服务、任务的优先级、进程是事件驱动还是时钟驱动、任务与其他进程和外界如何通信等;

(4) 数据管理部分(DMC),这一部分依赖于存储技术,是文件系统,还是关系数据库管理系统,还是面向对象数据库管理系统。

6.6.3 OMT方法

OMT方法从3个视角描述系统,相应地提供了3种模型:对象模型、动态模型和功能模型。

对象模型描述对象的静态结构和它们之间的关系。主要的概念包括类、属性、操作、继承、关联(即关系)和聚集。

动态模型描述系统中那些随时间变化的方面,其主要概念有状态、子状态和超状态、事件、行为和活动。

功能模型描述系统内部数据值的转换,其主要概念有加工、数据存储、数据流。控制流和角色。

该方法将开发过程分为4个阶段。

1. 分析

基于问题和用户需求的描述,建立现实世界的模型。分析阶段的产物有:

(1) 问题描述;

(2) 对象模型=对象图+数据词典;

(3) 动态模型=状态图+全局事件流图;

·139·

软件工程基础教程

·140··140·

(4) 功能模型=数据流图+约束。

2. 系统设计

结合问题域的知识和目标系统的体系结构(求解域),将目标系统分解为子系统。该阶段的主要产物是系统设计文档,即基本的系统体系结构和高层次的决策。

3. 对象设计

基于分析模型和求解域中的体系结构等添加的实现细节,完成系统设计。主要产物包括细化的对象模型、细化的动态模型和细化的功能模型。

4. 实现

将设计转换为特定的编程语言或硬件,同时保持可追踪性、灵活性和可扩展性。

6.6.4 Jacobson 方法

Jacobson 方法与上述3种方法有所不同,它涉及整个软件生命周期,包括需求分析、设计、实现和测试4个阶段。需求分析和设计密切相关。需求分析阶段的活动包括定义潜在的角色(角色指使用系统的人和与系统互相作用的软、硬件环境),识别问题域中的对象和关系,基于需求规范说明和角色的需要发现用例(use case),详细描述用例。设计阶段包括两个主要活动,从需求分析模型中发现设计对象,以及针对实现环境调整设计模型。第一个活动包括从用例的描述发现设计对象,并描述对象的属性、行为和关联。在这里还要把用例的行为分派给对象。

在需求分析阶段的识别领域对象和关系的活动中,开发人员识别类、属性和关系。关系包括继承、熟悉(关联)、组成(聚集)和通信关联。定义用例的活动和识别设计对象的活动,两个活动共同完成行为的描述。Jacobson 方法还将对象区分为语义对象(领域对象)、界面对象(如用户界面对象)和控制对象(处理界面对象和领域对象之间的控制)。

(1) 在该方法中的一个关键概念就是用例。用例是指行为相关的事务(transaction)序列,该序列将由用户在与系统对话中执行。因此,每一个用例就是一个使用系统的方式,当用户给定一个输入,就执行一个用例的实例并引发执行属于该用例的一个事务。基于这种系统视图,Jacobson 将用例模型与以下其他5种系统模型关联。

(2) 领域对象模型:用例模型根据领域来表示。

(3) 分析模型:用例模型通过分析来构造。

(4) 设计模型:用例模型通过设计来具体化。

(5) 实现模型:该模型依据具体化的设计来实现用例模型。

(6) 测试模型:用来测试具体化的用例模型。

习 题

1.名词解释

对象、类、消息、方法、继承性、单重继承、多重继承、多态性、重用性、对象模型、

第6章 面向对象方法学引论 ·141·动态模型、功能模型

2.填空题

(1) 在面向对象的设计方法中,_______和_______分别是表现事物及事物间相互联系的概念。

(2) 面向对象方法的基本思想是从现实世界中客观存在的事物出发来构造软件系统,并在系统构造中尽可能运用人类的_______方式。

(3) 对象是对现实世界实体的_______,它是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作,封装在一起所构成的统一体。

(4) 对象之间通过_______互相联系,以模拟现实世界中不同事物彼此之间的联系。

(5) 面向对象方法学的基本原则是按照人类习惯的思维方法建立_______的模型,开发出尽可能直观、自然地表现求解方法的软件系统。

(6) 对象具有_______性、______性、______性、______性、______性等。

(7) 类的定义是具有相同______和______的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述。

(8) 一个类的上层可以有______,下层可以有______,形成一种层次结构。

(9) 一个类可以直接继承多个类,这种继承方式称为______。如果限制一个类至多只能有一个超类,则一个类至多只能直接继承一个类,这种继承方式称为______。

(10) 如果类A具有类B的全部属性和全部服务,而且具有自己特有的某些属性或服务,则A叫做B的______,B叫做A的______。

(11) 在面向对象的系统中,每个对象都属于一个类,属于某个类的对象称为该类的一个______。

(12) 消息就是向对象发出的______,它应含有提供服务的对象标识、服务标识、输入信息和回答信息。

(13) ______性是面向对象程序设计语言不同于其他语言的最主要特点,是其他语言所没有的。

(14) 在收到消息时对象要予以响应,不同的对象收到同一消息可以产生完全不同的结果,这一现象叫做______。

(15) 面向对象的软件工程方法是面向对象方法在软件工程领域的全面运用,它包括面向______、______、______、______和面向对象的维护等主要内容。

(16) 用面向对象方法开发软件,通常需要建立三种形式的模型,分别是______、______、______模型。

(17) Booch方法是面向对象开发方法的倡导者。Booch认为软件开发是一个______的过程,上升的每个周期有固定的步骤,首先发现应用领域的______。

3.单项选择题

(1) 对象是面向对象开发方法的基本成分,每个对象可用它的一组( )和它可以执行的—组操作来定义。

A. 服务

B. 参数

C. 属性

D. 调用

·141·

第6章面向对象方法学引论

第6章 面向对象方法学引论 教学提示:本章主要讲述面向对象方法学的优缺点;面向对象的基本概念:对象、类、实例、消息、方法、封装、继承、多态性和重载等;面向对象的软件工程:OOA、OOD、 OOP、OOT;面向对象的建模及对象模型、动态模型、功能模型;面向对象的开发方法。 教学要求:面向对象的基本概念,比较抽象,教学中要注意结合面向对象的高级语言举一些例子来更深刻地领会。本章难点是面向对象的概念及特征和面向对象的模型。掌握面向对象的基本概念及特征,面向对象的建模,面向对象的软件工程。了解面向对象方法学的定义和优点,面向对象的开发方法。 面向对象的软件开发方法在20世纪60年代后期首次提出,经过将近20年这种技术才逐渐得到广泛应用。到了20世纪90年代前半期,面向对象的软件工程方法学已经成为人们在开发软件时首选的范例。今天看来,面向对象技术似乎是最好的软件开发技术 6.1 面向对象方法学概述 面向对象的技术是当前计算机界所关心的重点,是目前软件发展的主流。面向对象的概念来自面向对象的程序设计语言,实际上,面向对象的概念和应用已经超越了程序设计语言,扩展到很宽的范围,如面向对象的数据库系统、面向对象的系统分析与设计、CAD 技术、人工智能以及其他广泛的应用范围。 6.1.1 面向对象方法的发展历程 面向对象的方法的研究正在引起全世界越来越强烈的关注和高度重视,被誉为“研究最新技术的好方法”。针对日趋复杂的软件需求的挑战,软件业界开始崇尚利用面向对象的方法和思想进行软件开发。 与人类发明史上的许多创举不同,面向对象不是瞬间出现的。面向对象不是某个人的突发奇想,而是许多人经历多年研究积累的产物。 面向对象的方法起源于面向对象的程序设计语言。在20世纪60年代中期Simula-67的设计者Dahl和Nygaard 提出对象(object)的概念,在程序设计语言中开始使用数据封装(data encapsulation)的概念。在20世纪70年代,Liskov使用抽象数据类型(ADT)的理论和实现有了重大的进展,奠定了面向对象的基础。Liskov最著名的研究成果是CLU语言,支持隐藏内部数据表示方法。从20世纪70年代起,Xerox公司的 Palo Alto 研究中心经过对Smalltak 72、74连续不断的研究、改革后,在1980年推出了Smalltalk-80,它在系统设计中强调对象概念的统一,引入对象、对象类、方法和实例等概念及术语,采用了动态联编及单继承机制,体现了面向对象方法的许多重要概念,对面向对象方法学的形成和发展起

面向对象的软件开发方法简介

1面向对象的软件开发方法简介 面向对象的开发方法把软件系统看成各种对象的集合,对象就是最小的子系统,一组相关的对象能够组合成更复杂的子系统。面向对象的开发方法具有以下优点。 ●把软件系统看成是各种对象的集合,这更接近人类的思维方式。 ●软件需求的变动往往是功能的变动,而功能的执行者——对象一般不会有大的变 换。这使得按照对象设计出来的系统结构比较稳定。 ●对象包括属性(数据)和行为(方法),对象把数据和方法的具体实现方式一起封 装起来,这使得方法和与之相关的数据不再分离,提高了每个子系统的相对独立性, 从而提高了软件的可维护性。 ●支持封装,抽象,继承和多态,提高了软件的可重用性,可维护性和可扩展性。 1.1 对象模型 在面向对象的分析和设计阶段,致力于建立模拟问题领域的对象模型。建立对象模型既包括自底向上的抽象过程,也包括自顶向下的分解过程。 1.自底向上的抽象 建立对象模型的第一步是从问题领域的陈述入手。分析需求的过程与对象模型的形成过程一致,开发人员与用户交谈是从用户熟悉的问题领域中的事物(具体实例)开始的,这就使用户和开发人员之间有了共同语言,使得开发人员能够彻底搞清用户需求,然后再建立正确的对象模型。开发人员需要进行以下自底向上的抽象思维。 ●把问题领域中的事物抽象为具有特定属性和行为的对象。 ●把具有相同属性和行为的对象抽象为类。 ●若多个类之间存在一些共性(具有相同属性和行为),把这些共性抽象到父类中。 再自底向上的抽象过程中,为了使子类能更好的继承父类的属性和行为,可能需要自顶向下的修改,从而使整个类体系更加合理。由于这类体系的构造是从具体到抽象,再从抽象到具体,符合人们的思维规律,因此能够更快,更方便的完成任务。 2.自顶向下的分解 再建立对象模型的过程中,也包括自顶向下的分解。例如对于计算机系统,首先识别出主机对象,显示器对象,键盘对象和打印机对象等。接着对这些对象再进一步分解,例如主机对象有处理器对象,内存对象,硬盘对象和主板对象组成。系统的进一步分解因有具体的对象为依据,所以分解过程比较明确,而且也相对容易。因此面向对象建模也具有自顶向下开发方法的优点,既能有效的控制系统的复杂性,又能同时避免结构化开发方法中功能分解的困难和不确定性。 1.1.2UML:可视化建模语言 面向对象的分析与设计方法,在20世纪80年代末至90年代中发展到一个高潮。但是,诸多流派在思想和术语上有很多不同的提法,对术语和概念的运用也各不相同,统一是继续发展的必然趋势。需要有一种统一的符号来描述在软件分析和设计阶段勾画出来的对象模型,UML(Unified Modeling Language,统一建模语言)应运而生。UML是一种定义良好,易于表达,功能强大且普遍适用的可视化建模语言。而采用UML语言的可视化建模工具是Rational 公司开发的Rational Rose。 1.2 面向对象开发中的核心思想和概念 在面向对象的软件开发过程中,开发者的主要任务就是先建立模拟问题领域的对象模型,然后通过程序代码来实现对象模型,如何用程序代码来实现对象模型,并且保证软件系统的可重用性,可扩展性和可维护性呢?本节节主要阐述面向对象开发的核心思想和概念,这些核心思想为从事面向对象的软件开发实践提供理论武器。

面向对象技术引论(复习题)[参考解答]

《面向对象技术引论》复习题 一、概念与术语 1. 对象: 在现实世界中,对象定义为:问题的概念和抽象的或具有明确边界和意义的事物; 在数据世界中,对象定义为:一组数据以及施加于这组数据上的一组操作; 从系统的观点出发,我们可以给对象作如下定义:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位(单元),一个对象是由一组属性和对这组属性进行操作的一组服务构成的。 2.持久对象: 生存期可以超越程序的执行时间而长期存在的对象称为持久对象。换句话说:一个对象在程序运行结束后仍继续存在,则称该对象是持久的。 2.主动对象: 主动对象是一组属性和一组操作(服务)的封装体,其中至少有一个操作不需要接收消息就能主动执行(称为主动服务)。 3.被动对象: 被动对象(Passive object)是指其内部的操作需要通过外部消息驱动才能执行的对象。可以看出被动对象必须工作在消息驱动环境中。 4.类: 定义1 一组具有相同性质(属性和操作)的对象的抽象。 定义2 类是对一组具有相同属性、操作、关系和语义的对象的描述。 定义3 具有相同属性和容许操作的一组对象的一般描述称为类。 5.主动类: 主动类的对象至少拥有一个进程或线程,因此它能够自主执行(能够启动控制活动)。注意:主动类的对象所描述的元素的行为与其他元素的行为并发,这是它与一般类的唯一区别。6.接口: 接口是描述一个类或构件的一个服务的操作集。因此,接口描述元素的外部可见行为。接口描述了一组操作的规格,而不是操作的实现。图形上,用一个带有名称的圆表示接口。7.用况: 用况是对一组动作序列的描述,系统执行这些动作将产生一个对特定的参与者有价值而且可观察的结果。用况用于对系统语境和系统需求建模。图形上,用一个包含名称的实线椭圆表示用况。 8.协作: 协作定义了一个交互,它是由一组共同工作以提供某协作行为的角色和其他元素构成的一个群体,这些协作行为大于所有元素的各自行为的综合。因此协作有结构、行为和维度。图形上,用一个仅包含名称(协作名)的虚线椭圆表示协作。 9.构件: 构件是系统中物理的、可替代的部件,它遵循且提供一组接口的实现。构件是物理的、可替代的部件。 10.节点: 节点也是物理的,是在系统运行时存在的物理元素,它表示了一种可计算的资源,通常至少有一些记忆能力和处理能力。 11.一般类/ 12. 特殊类: 如果类A具有类B的全部属性和服务,而且具有自己特有的某些属性和服务,则类A叫做类B的特殊类,类B叫做的类A的一般类。两者之间的关系称为“泛化”。可以看出一般

常用的开发方法:结构化方法、原型法、面向对象方法

常用的开发方法:结构化方法、原型法、面向对象方法 常用的开发方法有:结构化方法、原型法、面向对象方法。 结构化方法:结构化方法是应用最为广泛的一种开发方法。按照信息系统生命周期,应用结构化系统开发方法,把整个系统的开发过程分为若干阶段,然后一步一步她依次进行,前一阶段是后一阶段的工作依据;每个阶段又划分详细的工作步骤,顺序作业。每个阶段和主要步骤都有明确详尽的文档编制要求,各个阶段和各个步骤的向下转移都是通过建立各自的软件文档和对关键阶段、步骤进行审核和控制实现的。它是由结构化分析、结构化设计和结构化程序设计三部分有机组合而成的。它的基本思想:把一个复杂问题的求解过程分阶段进行,而且这种分解是自顶向下,逐层分解,使得每个阶段处理的问题都控制在人们容易理解和处理的范围内。 以数据流图,数据字典,结构化语言,判定表,判定树等图形表达为主要手段,强调开发方法的结构合理性和系统的结构合理性的软件分析方法。 结构化方法方法具有如下特点。 (l)遵循用户至上原则。 (2)严格区分工作阶段,每个阶段有明确的任务和取

得的成果。 (3)强调系统开发过程的整体性和全局性。 (4)系统开发过程工程化,文档资料标准化。 该方法的优点是:理论基础严密,它的指导思想是用户需求在系统建立之前就能被充分了解和理解。由此可见,结构化方法注重开发过程的整体性和全局性。 该方法的缺点是:开发周期长;文档、设计说明繁琐,工作效率低;要求在开发之初全面认识系统的信息需求,充分预料各种可能发生的变化,但这并不十分现实;若用户参与系统开发的积极性没有充分调动,造成系统交接过程不平稳,系统运行与维护管理难度加大。 原型法:原型法的基本思想与结构化方法不同,原型法认为在很难一下子全面准确地提出用户需求的情况下,首先不要求一定要对系统做全面、详细的调查、分析,而是本着开发人员对用户需求的初步理解,先快速开发一个原型系统,然后通过反复修改来实现用户的最终系统需求。 是在投入大量的人力,物力之前,在限定的时间内,用最经济的方法开发出一个可实际运行的系统模型,用户在运行使用整个原型的基础上,通过对其评价,提出改进意见,对原型进行修改,统一使用,评价过程反复进行,使原型逐步完善,直到完全满足用户的需求为止。 适用范围:处理过程明确、简单系统;涉及面窄的小型系统

面向对象方法

面向对象方法 1、对象:是系统中用来描述客观事务的一个实体,是构成系统的一个基本单位。三个要素:对象标志(供系统内部唯一的识别对象);属性(状态、数据、用来描述对象的静态特征);服务(操作、行为或方法,用来描述对象的动态特征) 2、面向对象=对象(objects)+类(classes)+继承(inheritance)+消息通信(communication with messages) 3、封装是对象的一个重要原则。有2 个含义:对象是全部属性和全部服务紧结合而形成的一个不可分隔的整体;对象是一个不透明的黑盒子,表示对象状态的数据和实现操作的代码都被封装在黑盒子里面。 4、类和类库:类是对象的抽象定义,是一组具有相同数据结构和相同操作的对象的集合。类与对象是抽象描述与具体实例的关系,一个具体的对象被称为类的一个实例(instance)。 5、继承:使用已存在的定义作为基础建立新定义的技术。父类、子类要了解。 6、多态性:可以分为四类:过载多态(重载多态),强制多态,包含多态,参数多态。前两种统称为专用多态(特定多态),后两种称为通用多态。 7、消息:指向对象发出的服务请求,它应该含有下述

信息:提供服务的对象标志、消息名、输入信息和回答信息 8、消息通信:封装使对象成为一些各司其职、互不干扰的独立单位;消息通信为他们提供了唯一的合法的动态联系途径,使他们的行为能够相互配合,构成一个有机的系统。只有同时使用对象、类、继承与消息通信,才是真正面向对象的方法。 9、统一建模语言UML---是一种语言;是一种可视化语言;是一种可用于详细描述的语言;是一种构造语言;是一种文档化语言 10、UML 结构:构造块(建模元素、关系、图);公共机制(规格说明、修饰、公共分类、扩展机制);构架(逻辑视图、进程视图、实现视图(构建)、布署视图、用例视图)裸狗不用进 11、UML 视图:系统静态结构的静态模型(包括类图、构件图、部署图),系统动态结构的动态模型(包括对象图、用例图、序列图、协作图、状态图、活动图) 12、用例图:用例模型描述的是外部执行者(Actor)所理解的系统功能,用于需求分析阶段。(十四个图能认出来) 参与者(Actor)代表与系统接口的任何事物或人,它是指代表某一种特定功能的角色,参与者都是虚拟的概念。

面向对象的建模方法

面向对象的建模方法 [摘要]评述面向对象的几种建模方法并作一比较,阐述统一建模语言的优越性,并对其组成、特征、建模过程进行描述。 [关键词]软件工程建模面向对象 一、引言 面向对象方法学也称为面向对象的开发方法,它属于软件工程的范畴。面向对象方法学的出发点和基本原则是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程接近人类认识世界解决问题的方法与过程。也就是说,面向对象方法是一种崭新的思维方法,它是把程序看作是相互协作而又彼此独立的对象的集合。由于对象的独立封装,模块的可构造性、可扩充性、可重用性也大大加强,从而面向对象的软件工程能够胜任当今大规模复杂、易变软件系统开发应用的要求。 面向对象的软件工程要求首先对系统建立模型是对现实的简化,它提供了系统的蓝图。一个好的模型只需抓住影响事物发展的主要矛盾,而忽略那些次要矛盾。每个系统可以从不同方面用不同的模型来描述。因而每个模型都是在语义上闭合的系统抽象。通过建模可以按照实际情况对系统进行可视化模型详细地说明了系统结构或行为,指导我们构造系统模板 二、面向对象建模方法 建模是构造软件系统最基本的步骤,在软件工程学科中提供了多种多样的建模方法和高效的工具,其目的是为了在软件开发过程的早期就发现设计中可能隐含的缺陷和错误,对于今日的大型软件系统,采用一种合适的建模方法,建立一个良好的模型是成功的关键。在市场上已有一些公司,如Rationa1,Cayenne,Platinum等开始提供商品化的建模工具,即通常所谓的CASE工具,使得建模过程实现了一定的自动化的标准化,并逐步走向实用,而这些工具的后面,便是具有不同特色的建模方法。 下面分析比较Booch,OMT,OOSE,UML等几种主要的面向对象的建模方法: (一)Booch方法 Booch方法是由Grady Booch提出的,是一种主要面向设计的方法,它通过二维图形来建立面向对象的分析和设计模型,强调设计过程的不断反复知道满足要求为止。Booch 方法特别注重对系统内对象之间相互行为的描述,注重可交流性和图示表达。但在方法学上并不注重严格的过程,既不推荐软件设计人员该做什么,只是指出了其可做的工作。Booch 方法把几类不同的图表有机地结合起来,以反映系统的各个方面是如何可相互联系而又相互影响的。这些图贯穿于逻辑设计到物理实现的开发过程中,包括类图、状态图、对象图、交互图、模块图和进程图。 (二)OMT方法 OMT(Object Modeling Technology对象建模技术)是由JamesRumbaugh 等人提出的。OMT方法包含了一整套的面向对象的概念和独立于语言的图示符号。它可用于分析问题需求,设计问题的解法以及用程序设计语言或数据库来实现这个解法。OMT方法用一致的概念和图示贯穿于软件开发的全过程,这样软件开发人员不必在每一开发阶段便换新的表示方法。 OMT方法从对象模型、动态模型、功能模型3个不同但又相关的角度来进行系统建模。这3个角度各自用不同的观点抓住了系统的实质,全面地反映了系统的需求。其中,对象模型表示了静态的、结构化的系统数据性质,动态模型表示了瞬时的、行为化的系统的控制性质,功能模型则表示了变化的系统的功能性质。在软件开发的周期中,这3种模型都在逐渐发展:在分析阶段,构造出不考虑最终设计的应用域模型;在设计阶段,求解域的结构被

比较四种典型面向对象方法的异同

普 通 本 科 毕 业 小 论 文 题目:比较四种典型面向对象方法的异同 学院软件与通信工程学院 学生姓名张伟聪学号 0123992 专业软件工程届别 125 指导教师廖汉成 二O一四年九月二十七日

一、引言 随着计算机科学的发展和应用领域的不断扩大,对计算机技术的要求越来越高。特别是当计算机硬件有了飞速发展之后,各种应用领域对软件提出了更高的要求。结构化程序设计语言和结构化分析与设计已无法满足用户需求的变化。发展软件质量,缩短软件开发周期,发展软件可靠性、可扩充性和可重用性迫使软件界人士不断研究新方法、新技术,探索新途径。 面向对象的方法是一种分析方法、设计方法和思维方法。面向对象方法学的出发点和所追求的基本目标是使人们分析、设计与实现一个系统的方法尽可能接近人们认识一个系统的方法。也就是使描述问题的问题空间和解决问题的方法空间在结构上尽可能一致。其基本思想是:对问题空间进行自然分割,以更接近人类思维的方式建立问题域模型,以便对客观实体进行结构模拟和行为模拟,从而使设计出的软件尽可能直接地描述现实世界,构造出模块化的、可重用的、维护性好的软件,同时限制软件的复杂性和降低开发维护费用。面向对象程序设计方法起源于六十年代末期的语言SIMULA’67,到了七十年代末期,软件行业正受到软件危机的困扰,结构化的开发方法不能够很好地解决软件危机。面向对象语言Smalltalk的出现,进一步发展和完善了面向对象的程序设计语言,从此面向对象也和开发方法开始结合,出现了面向对象的开发方法。 自80年代后期以来,相继出现了多种面向对象开发方法,现将其中四种典型的方法作一个简介和比较。面向对象方法都支持三种基本的活动:识别对象和类,描述对象和类之间的关系,以及通过描述每个类的功能定义对象的行为。 一.Booch方法 Booch是面向对象方法最早的倡导者之一,他提出了面向对象软件工程的概念。1991年,他将以前面向Ada的工作扩展到整个面向对象设计领域。Booch方法的开发模型包括静态模型和动态模型,静态模型分为逻辑模型和物理模型,描述了系统的构成和结构,动态模型分为状态图和时序图。该方法对每一步都作了详细的描述,描述手段丰富、灵活。不仅建立了开发方法,还提出了设计人员的技术要求,不同开发阶段的资源人力配制。OOD[3](Object Oriented Design)方法是Grady Booch从1983年开始研究,1991年后走向成熟的一种方法。OOD主要包括下述概念:类(class)、对象(object)、使用(uses)、实例化(instantiates)、继承(inherits)、元类(meta class)、类范畴(class category)、消息(message)、域(field)、操作(operation)、机制(mechanism)、模块(module)、子系统(subsystem)、过程(process)等。其中,使用及实例化是类间的静态关系,而动态对象之间仅有消息传递的连接。元类是类的类。类范畴是一组类,它们在一定抽象意义上是类同的。物理的一组类用模块来表达。机制是完成一个需求任务的一组类构成的结构。 Booch方法的过程包括以下步骤: (1)在给定的抽象层次上识别类和对象; (2)识别这些对象和类的语义; (3)识别这些类和对象之间的关系; (4)实现类和对象;

传统方法学与面向对象区别

小议传统方法学与面向对象的区别 姓名:戴育兵 学号:G1030510 年级 :大二 班级: .net(2)班

摘要 传统的软件工程方法学曾经给软件产业带来巨大进步,部分地缓解了软件危机,使用这种方法学开发的许多中、小规模软件项目都获得了成功。但是,人们也注意到当把这种方法学应用于大型软件产品的开发时,似乎很少取得成功。 在20世纪60年代后期出现的面向对象编程语言Simdla_67中首次引入了类和对象的概念,自20世纪80年代中期起,人们开始注重面向对象分析和设计的研究,逐步形成了面向对象方法学。到了20世纪90年代,面向对象方法学已经成为人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。

软件工程传统方法学 1.传统方法学概述 随着计算机应用领域的不断拓广,各种各样的问题也不断涌现,当问题严重到开发人员无法控制的时候便产生了软件危机。软件危机的出现,促使了软件工程学的形成和发展。随之整合整套技术的软件工程方法学广泛应用,主流之一就是传统方法学。传统方法学在软件开发过程中占据相当大的比重,因为其悠久的历史而为很多软件工程师青睐。如果说自然语言和编程语言之间有一道难以跨越的鸿沟,传统方法学就是跨越这道鸿沟的桥梁。 传统方法学又称生命周期方法学或结构化范型。一个软件从开始计划起,到废弃不用止,称为软件的生命周期。在传统的软件工程方法中,软件的生存周期分为需求分析、总体设计、详细设计、编程和测试几个阶段。 传统方法学使用的是结构化分析技术来完成需求分析阶段的工作。软件工程学中的需求分析具有两方面的意义。在认识事物方面,它具有一整套分析、认识问题域的方法、原则和策略。这些方法、原则和策略使开发人员对问题域的理解比不遵循软件工程方法更为全面、深刻和有效。在描述事物方面,它具有一套表示体系和文档规范。但是,传统的软件工程方法学中的需求分析在上述两方面都存在不足.它在全局范围内以功能、数据或数据流为中心来进行分析。这些方法的分析结果不能直接地映射问题域,而是经过了不同程度的转化和重新组合。因此,传统的分析方法容易隐蔽一些对问题域的理解偏差,与后续开发阶段的衔接也比较困难。 在总体设计阶段,以需求分析的结果作为出发点构造出一个具体的系统设计方案,主要是决定系统的模块结构,以及模块的划分,模块间的数据传送及调用关系。详细设计是在总体设计的基础上考虑每个模块的内部结构及算法,最终将产生每个模块的程序流程图。但是传统的软件工程方法中设计文档很难与分析文档对应,原因是二者的表示体系不一致,所谓从分析到设计的转换,实际上并不存在可靠的转换规则,而是带有人为的随意性,从而很容易因理解上的错误而留下隐患。 编程阶段是利用一种编程语言产生一个能够被机器理解和执行的系统,测试是发现和排除程序中的错误,最终产生一个正确的系统。但是由于分析方法的缺陷很容易产生对问题的错误理解,而分析与设计的差距很容易造成设计人员对分析结果的错误转换,以致在编程时程序员往往需要对分析员和设计人员已经认识过的事物重新进行认识,并产生不同的理解。因此为了使两个阶段之间能够更好的衔接,测试就变得尤为重要。 软件维护阶段的工作,一是对使用中发生的错误进行修改,二是因需求发生了变化而进行修改。前一种情况需要从程序逆向追溯到发生错误的开发阶段。由于程序不能映射问题以及各个阶段的文档不能对应,每一步追溯都存在许多理解障碍。第二种情况是一个从

三种面向对象方法

三个著名的面向对象开发方法

摘要 主要介绍了3种典型的面向对象开发方法,并对它们进行了比较。面向对象的方法是一种分析方法、设计方法和思维方法。面向对象方法学的出发点和所追求的基本目标是使人们分析、设计与实现一个系统的方法尽可能接近人们认识一个系统的方法。 关键字:面向对象;开发方法;OMT;BOOCH;JACOBSON; 1.引言 面向对象的方法是一种分析方法、设计方法和思维方法。面向对象方法学的出发点和所追求的基本目标是使人们分析、设计与实现一个系统的方法尽可能接近人们认识一个系统的方法。也就是使描述问题的问题空间和解决问题的方法空间在结构上尽可能一致。其基本思想是:对问题空间进行自然分割,以更接近人类思维的方式建立问题域模型,以便对客观实体进行结构模拟和行为模拟,从而使设计出的软件尽可能直接地描述现实世界,构造出模块化的、可重用的、维护性好的软件,同时限制软件的复杂性和降低开发维护费用。 面向对象程序设计方法起源于六十年代末期的simnia语言.Smalltalk语言的出现,进一步发展和完善了面向对象的程序设计语言,从此面向对象与开发方法开始结合,出现 了面向对象的开发方法.自80年代后期以来,相继出现了多种面向对象开发方法,现将其中几种典型的方法作一比较分析. 2.三种典型的面向对象开发方法 2.1 OMT/Rumbaugh OMT(Object Modeling Technique)方法提出于1987年,曾扩展应用于关系数据库设计.1991年Jim Rumbaugh正式把OMT应用于面向对象的分析和设计.这种方法是在 实体关系模型上扩展了类、继承和行为而得到的.OMT覆盖了分析、设计和实现3个阶段,包括一组相互关联的类(class )、对象(object)、一般化(generalization)、继承(inheritance)、链(link)、链属性(link attribute)、聚合(aggregation)、操作(operation)、事件(event)、场景(scene)、属性(attribute)、子系统(subsystem)、模块(module)等概念. OMT方法把分析时收集的信息构造在3种模型中,这些模型贯穿于每个步骤,在每个步骤中被不断地精化和扩充.对象模型用ER图描述问题域中的列象及其相互关系,用类和关系来刻画系统的静态结构,包括系统中的对象、对象之间的关系、类的属性和操作等特征.动态模型用事件和对象状态来刻画系统的动态特性,包括系统对象的事件序列、状态和操作.功能模型按照对象的操作来描述如何从输入给出输出的结果,描述动态模型的动作所定义对象操作的意义。 OMT方法包含分析、系统设计、对象设计和实现4个步骤,它定义了3种模型,这些模型贯穿于每个步骤,在每个步骤中被不断地精化和扩充。这3种模型是:对象模型,用类和关系来刻画系统的静态结构;动态膜型,用事件和对象状态来刻画系统的动态特性;功能模型,按照对象的操作来描述如何从输人给出输出结果。分析的目的是建立可理解的现实世界模型。系统设计确定高层次的开发策略。对象设计的目的是确定对象的细节,包括定义对象的界面、算法和操作。实现对象则在良好的面向对象编程风格的编码原则指导下进行。 开发的四个阶段如下: (1)分析。基于问题和用户需求的描述,建立现实世界的模型。分析阶段的产物有: ●问题描述 ●对象模型=对象图+数据词典 ●动态模型=状态图+全局事件流图 ●功能模型=数据流图+约束 (2)系统设计。结合问题域的知识和目标系统的系统结构(求解域),将目标系统

面向对象方法学概述资料

9.1 面向对象方法学概述 9.2 面向对象的概念 9.3 面向对象建模 9.4 对象模型 9.5 动态模型 9.6 功能模型 9.7 3种模型之间的关系 传统的软件工程方法学曾经给软件产业带来巨大进步,部分地缓解了软件危机,使用这种方法学开发的许多中、小规模软件项目都获得了成功。但是,人们也注意到当把这种方法学应用于大型软件产品的开发时,似乎很少取得成功。 在20世纪60年代后期出现的面向对象编程语言Simula-67中首次引入了类和对象的概念,自20世纪80年代中期起,人们开始注重面向对象分析和设计的研究,逐步形成了面向对象方法学。到了20世纪90年代,面向对象方法学已经成为人们在开发软件时首选的范型。面向对象技术已成为当前最好的软件开发技术。 9.1 面向对象方法学概述 9.1.1 面向对象方法学的要点 面向对象方法学的出发点和基本原则,是尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间(也称为问题域)与实现解法的解空间(也称为求解域)在结构上尽可能一致。 面向对象方法学所提供的“对象”概念,是让软件开发者自己定义或选取解空间对象,然后把软件系统作为一系列离散的解空间对象的集合。应该使这些解空间对象与问题空间对象尽可能一致。这些解空间对象彼此间通过发送消息而相互作用,从而得出问题的解。也就是说,面向对象方法是一种新的思维方法,它是把程序看作是相互协作而又彼此独立的对象的集合。

概括地说,面向对象方法具有下述4个要点: (1) 认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。按照这种观点,可以认为整个世界就是一个最复杂的对象。因此,面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。 由此可见,面向对象方法用对象分解取代了传统方法的功能分解。 (2) 把所有对象都划分成各种对象类(简称为类,class),每个对象类都定义了一组数据和一组方法。数据用于表示对象的静态属性,是对象的状态信息。因此,每当建立该对象类的一个新实例时,就按照类中对数据的定义为这个新对象生成一组专用的数据,以便描述该对象独特的属性值。 (3) 按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承(inheritance)。 (4) 对象彼此之间仅能通过传递消息互相联系。对象与传统的数据有本质区别,它不是被动地等待外界对它施加操作,相反,它是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。 重点:如果仅使用对象和消息,则这种方法可以称为基于对象的(object-based)方法,而不能称为面向对象的方法;如果进一步要求把所有对象都划分为类,则这种方法可称为基于类的(class-based)方法,但仍然不是面向对象的方法。只有同时使用对象、类、继承和消息的方法,才是真正面向对象的方法。 9.1.2 面向对象方法学的优点 1. 与人类习惯的思维方法一致 2. 稳定性好 3. 可重用性好(重点) 用已有的零部件装配新的产品,是典型的重用技术,例如,可以用已有的预制件建筑一幢结构和外形都不同于从前的新大楼。重用是提高生产率的最主要的方法。

软件设计师面向对象方法学(一)

[模拟] 软件设计师面向对象方法学(一) 选择题 第1题: 下列关于静态多态实现重载的描述中正确的是______。 A.重载的方法(函数)的方法名(函数名)可以不同 B.重载的方法(函数)必须在返回值类型以及参数类型上有所不同 C.重载的方法(函数)必须在参数顺序或参数类型上有所不同 D.重栽的方法(函数)只需在返回值类型上有所不同 参考答案:C 第2题: 程序设计语言提供了基本类型及其相关的操作,而______则允许开发者自定义一种新的类型及其相关的操作。 A.对象 B.实例 C.类 D.引用 参考答案:C 第3题: ______表示了对象间“is-a”的关系。 A.组合 B.引用 C.聚合 D.继承 参考答案:D 第4题: 若对象A可以给对象B发送消息,那么______。 A.对象B可以看见对象A B.对象A可以看见对象B C.对象A、B相互不可见

D.对象A、B相互可见 参考答案:B 第5题: 类描述了一组对象共同的特性,下列叙述中正确的是______。 A.类本身不能具有变量 B.对象具有类定义的所有变量的一份拷贝 C.对象间不能共享类定义的变量 D.可通过类名访问静态变量(类变量) 参考答案:D (6) 反映了类间的一种层次关系,而(7) 反映了一种整体与部分的关系。 第6题: A.继承 B.组合 C.封装 D.多态 参考答案:A 第7题: A.继承 B.组合 C.封装 D.多态 参考答案:B 第8题: 下列叙述中正确的是______。 A.d西向对象程序设计语言都不支持过程化的程序设计 B.面向对象系统只可采用面向对象程序设计语言实现 C.某些过程化程序设计语言也可实现面向对象系统

结构化方法与面向对象方法比较

结构化方法与面向对象方法的内在联系 (一)二者在分解和抽象原则上一致 分解和抽象是软件开发中控制问题复杂性的重要原则。分解即化 整分零,将问题剥茧抽丝,层层消化;抽象则是通过分解体现,在逐层分解时,上层是下层的抽象,下层是上层的具体解释和体现,运用抽象可以不用一次考虑太多细节,而逐渐的有计划有层次的了解更多细节。面向对象方法与结构化方法在运用分解和抽象原则上的要求是完全一致的。 (二)局部化和重用性设计上的一致 局部化是软件开发中的一个重要原则,即不希望软件一部分过多 地涉及或影响软件的其它部分。在结构化方法中,局部化主要体现在代码与数据的分隔化,即程序各部分除必要的信息交流外,彼此相互隔离而互不影响,而面向对象方法则采用数据、代码的封装,即将数据、代码和操作方法封装成一个类似“黑箱”的整体对象,提高了程序的可靠性和安全性,同时增强了系统的可维护性。也就是说面向对象方法比结构化方法的运用更加深入更彻底。 结构化方法与面向对象方法的区别 (一)处理问题时的出发点不同 结构化方法是强调过程抽象化和模块化,以过程为中心构造或处 理客观世界问题的,它是一种面向过程的开发方法;面向对象方法强调把问题域的要领直接影射到对象及对象之间的接口上,是用符合人们通常的思维方式来处理客观世界的问题。

(二)处理问题的基本单位和层次逻辑关系不同 结构化方法把客观世界的问题抽象成计算机可以处理的过程,处 理问题的基本单位是能清晰表达过程的模块,用模块的层次结构概括模块或模块间的关系和功能;面向对象方法是用计算机逻辑来模拟客观世界中的物理存在,以对象的集合类作为处理问题的基本单位,尽可能使计算机世界向客观世界靠拢,以使问题的处理更直截了当,面向对象方法是用类的层次结构来体现类之间的继承和发展。 (三)数据处理方式与控制程序方式不同 结构化方法是直接通过程序来处理数据,处理完毕后即可显示处 理结果,在控制程序方式上是按照设计调用或返回程序不能自由导航,各模块程序之间存在着控制与被控制的关系;面向对象方法将数据与对应的代码封装成一个整体,原则上其它对象不能直接修改其数据,即对象的修改只能由自身的成员函数完成,控制程序方式上是通过“事件驱动”来激活和运行程序。 (四)分析设计与编码转换方式不同 结构化方法强调分析、设计及编码之间按规则进行转换,贯穿软件 生命周期的分析、设计及编码之间实现的是一种有缝的连接;面向对象方法从分析到设计再到编码则采用一致性的模型表示,贯穿软件生命周期的分析、设计及编码之间是一种平滑过程,即实现的是一种无缝连接。 结构化方法和面向对象方法各有优缺点 主要表现在如下几个方面:

面向对象方法学试题及答案

C++程序设计试题(下)样卷(卷面50分) (考试用时100分钟) 一、选择题(每题1分,共5分) 1.设计一个自定义类时,需要在屏幕上显示或向文件写入类对象的数据,最佳选择方法是。 A.为屏幕显示和文件写入各自设计一个成员函数。 B.为屏幕显示和文件写入统一设计一个成员函数。 C.重载插入运算符(<<)。 D.重载提取运算符(>>)。 2.关于异常处理,那些说法是错误的。 A.在C++程序中,由throw表达式抛出异常,而该表达式应直接或间接地被包含在try块中。 B.当抛出异常后,寻找匹配的catch子句有固定的过程:逆着程序函数的调用链返回,称为栈展开(Stack Unwinding)。 C.当某条语句抛出异常时,跟在其后的语句将被跳过,但析构函数仍然执行,所以应该在析构函数中释放资源。 D.catch子句实际是一个特殊的函数。 3.下列关于动态资源分配的说法中错误的是。 A.动态分配的资源不仅包括内存,还包括文件。 B.动态内存分配的优点在于可以随时给数组分配所需的内存而不会失败。C.动态分配的资源通常要求在析构函数中释放。 D.对含有动态分配的数据成员的类对象应该采用深复制。 4.下列有关模板的描述那些是错误的。 A.模板把数据类型作为一个设计参数,称为参数化程序设计。 B.模板参数除模板类型参数外,还有非类型参数。 C.类模板与模板类是同一概念。 D.使用时,模板参数与函数参数相同,是按位置而不是名称对应的。 5.关于多态,下面那些说法是正确的。 A.多态分静态的(编译时)和动态的(运行时)。 B.运行时的多态与类的层次结构有关。 C.在基类定义了虚函数后,在派生类中重新定义时可以不加关键字virtual。D.仅使用虚函数并不能实现运行时的多态性,还必须采用指针或引用来调用才能真正实现运行时的多态性。 二、填空题(每空0.5分,共5分) 1.有标准字符串类string对象str,str1,str2。对其字符元素的访问可用两种方式:str[i]和str.at(i)。两者的区别是(1)。str1+=str2 实现的运算是(2)。str.substr(pos,length1) 实现的运算是(3)。

面向对象方法的发展历史

面向对象方法的发展历史 (一)80年代面向对象的方法已成为新趋势 在五年之内方法论从5种开发到50种以上,面向对象最早开始提到的概念是在1986年,一开始就有五、六种不同的方法论,但在五年之内,它就开发到50多家,所以开发速度是很快的。 布什(Booch),面向对象软件工程在这些方法之中居于领导地位。比较出名的Booch 方法由布什所发明;OMT由詹姆斯、云豹(James Rumbaugh)所发明;00SE由雅寇森(Jacobson)所发明。 另外的方法如:尤顿(coad-Yoadon),雪梨、米勒(Shlaer-Mellor)等各种不同方法。(二)不同的总是表面 在共同的想法上集中收敛,因为各家所提出的方法都很多,大家当然要大战一场。每一个人都说大话,说他们自己的最好,但事实上如果看到他们的本质,很多的方法都是相同的,性质也相似。 不同的是记号法和术语,不同的不是它的设计结构,而是所用的语言、术语,还有它的记号法,这种情形,在沟通上可能会产生一些问题。基本上创造软件的语言,如果说术语不同的话,就没有办法沟通,但是剥开语言的层次看,它的实质都是相同的,逻辑设计概念都是相似的,所以这方面倒是非常相近。 (三)实际工程展示的工作与早期的方法经验有关 所以大家都说他们是最好的,到底谁是最好的,就是看他实际应用的经验,经验越多,它能够被使用的次数越多,那就证明它越好用。 (四)OMT分析与设计过程 1、对象模型、动态模型和功能模型各自呈现对系统的观点,彼此间又相互关联。 2、对象模型提供动态及功能模型运算操作所需的数据结构; 3、动态模型描述对象的控制结构; 4、功能模型描述那些被对象模型的“运算”及动态模型的“操作”所调用的功能。(五)OMT系统分析方法 1、分析的过程,并不—定是循序渐进的。尤其是复杂的系统,通常要经过许多次反复的分析,才能建立完整的模型; 2、对象模型显示出系统静态的数据结构,在建立对象模型时,须从该系统的问题描述及它所牵涉的领域范围来考虑; 3、动态模型显示系统受时间影响所产生的动态行为。开始分析动态模型时必须找出事件,然后将影响每个对象的事件串行起来,用状态图表示出来; 4、功能模型显示系统内数据转换的情形,功能模型是绘制多个数据流程图的集合; 5、系统分析的工作并不是简单地一次就能完成,通常要经过许多次反复的修正才能完成。在完成分析工作之后,必须再与用户做核对,以确保分析的结果与系统的问题描述相符合,否则修正的工作必须重复进行,直到两者符合为止。 6、分析的过程,并不—定是循序渐进的。尤其是复杂的系统,通常要经过许多次反复的分析,才能建立完整的模型。 (六)BOOCH面向对象开发模型 1、逻辑模型:描述关键抽象与机制的意义,以定义系统结构成问题描述 2、实体模型:从软硬件的角度来描述系统的概观或设置 3、静态模型:描述对象类的属性、关系的静态方面 4、动态模型:表现对象类间的互动关系

4面向对象方法学

第 1 页 第四讲 面向对象方法学 生命周期方法学回顾 1、 生命周期方法学的特点 生命周期方法学是一种传统的软件工程方法学,其主要特点是: 严格的分阶段计划 以时间分解为基础来控制和管理整个软件开发过程的,将软件开发过程划分为许多首尾相接、相互独立的阶段。 “瀑布式”开发模式 软件开发阶段在时间上严格地实施顺序,不能反复。每个阶段完成后才进行下一个阶段的工作,并且前一个阶段的成果作为下一个阶段工作开始的依据。 严格的技术审查和管理复审 在软件开发的每一个阶段结束后,进行严格的技术审查和管理复审,排除所有潜在的错误,保证瀑布模型的实施,并从成本和进度上管理和控制软件开发。 结构化技术 结构化技术内涵为“自上而下,逐步求精”,生命周期方法学在各个阶段采用结构化技术,包括结构化分析、结构化设计、结构化程序设计等。 从以上特点可以看出,生命周期方法学是以软件功能为基础来进行软件开发的,面向的软件实体由一段段可执行的程序代码组成,并以模块作为基本的软件结构体,可以由程序代码的运行来实现所需的软件功能,满足用户的需求。 也正是由于生命周期方法学的以上特点,使得它在软件工程实践中也暴露出 了许多问题: 对功能需求分析的依赖 生命周期方法学的软件开发成果对于功能需求分析有很强的依赖性,要求需求分析阶段的结果一定要全面、准确、清晰,不能有任何错误或模糊的东西。而一旦对需求分析中确定的需求进行了任何改变,都会直接影响到整个软件的设计和实现,对软件进行的修改要付出很大的代价。 但是在实际操作过程中,一方面用户很难一次性地写出既完善又正确无误的功能要求,另一方面所确定的功能要求,又有可能随着时间的变化或者用户对系统理解的逐步深入发生变化。这种软件功能需求的变化在实际软件项目的开发过程中是不可避免和屡见不鲜的,但它对生命周期方法学来说又是灾难性的,这使 得生命周期方法学在软件开发实践中往往处于被动的地位。 软件重用性差 如果某个软件开发中的成果不能够保存下来,并且在其它软件的开发过程中得到应用,那么对于软件开发的生产力来说,就是一种极大的浪费。使软件开发中产生的成果能够被别的软件项目所利用,称为软件的重用性。 在生命周期方法学中,对软件进行模块划分,是致力于提高软件重用性的一种努力。软件模块具有相对独立的功能,能够完成对信息的某一种处理,因此理论上可以被别的用到相同功能的软件所使用。但各种不同的软件系统中,完全相同的功能是很难见到的,总会因为数据类型、处理细节、允许范围等等原因存在

面向对象方法题库1-0-5

面向对象方法题库1- 0-5

问题: [单选]当()时,用例是捕获系统需求最好的选择。 A.系统具有很少的用户 B.系统具有很少的接口 C.系统算法复杂,功能单一 D.系统有很多参与者 用例描述的是系统的执行者(参与者)与系统的交互,同时也是开发人员与用户进行交流的工具,可用来很好地定义系统的边界。所以,当执行者较多的时候,用例是捕获系统需求最好的选择。

问题: [单选]对OO系统的技术度量的识别特征,Berard定义了导致特殊度量的特征。其中()抑制程序构件的操作细节,只有对访问构件必需的信息被提供给其他希望访问的构件。 A.局部化 B.封装 C.信息隐藏 D.继承 面向对象的软件和用传统方法开发的软件有本质的不同,为此,对OO系统的技术度量必须调整以适应那些区别OO和传统软件的特征。Berard定义了5个导致特殊度量的特征,分别是局部化、封装、信息隐蔽、继承和对象抽象技术。 (1)局部化。局部化是软件的一个特征,它指明信息在程序中被集中的方式,例如,针对功能分解的传统方法围绕功能局部化信息,它们典型地以过程模块来实现。数据驱动方法围绕特定的数据结构局部化信息。在OO语境中,信息是通过封装数据和处理在类或对象的边界内而集中的。因为传统软件强调函数为局部化机制,软件度量着重于函数的内部结构或复杂性(例如,模块长度、内聚性或环路复杂性等)或函数间相互连接的方式(例如,模块耦合)。因为类是OO系统的基本单位,所以,局部化是基于对象的,因此,度量应该应用于作为一个完全实体的类(对象)。此外,在操作(函数、方法)和类间的关系不必要是一对一的。因此,反应类协作方式的度量必须能够适应一对多和多对一的关系。

相关文档
最新文档