- UML与Rose建模实用教程
- 吕云翔 赵天宇 丛硕
- 4060字
- 2025-02-23 13:50:12
1.2 面向对象方法简介
一切事物皆对象。通过面向对象的方式,将现实世界的事物抽象成对象,现实世界中的关系抽象成类、继承,帮助人们实现对现实世界的抽象与数字建模。面向对象的概念极大地丰富了软件开发方法,也是UML出现的背景和基础。本节将主要介绍面向对象的相关内容。
1.2.1 什么是面向对象方法
如今,面向对象方法(Object-Oriented Method,OOM)已深入计算机软件领域的各个分支。它不仅是一些具体的软件开发技术与策略,而且是一整套关于如何看待软件系统与现实世界的关系,用什么观点来研究问题并进行问题求解,以及如何进行软件系统构造的软件方法学。
面向对象方法解决问题的思路就是主张从客观世界固有的事物出发来构造系统,提倡用人类在现实生活中常用的思维方法来认识、理解和描述客观事物,强调最终建立的系统能够映射问题域,也就是说,系统中的对象以及对象之间的关系能够如实地反映问题域中固有事物及其关系。一般来说,面向对象方法是一种运用一系列面向对象的指导软件构造的概念和原则(如类、对象、抽象、封装、继承、多态、消息等)来构造软件系统的开发方法。从本质上讲,面向对象方法是对这些概念和原则的应用。
面向对象的思想已经被软件开发过程的各个阶段所应用。例如,面向对象分析(Object Oriented Analysis,OOA)、面向对象设计(Object Oriented Design,OOD),以及面向对象编程实现(Object Oriented Programming,OOP)。
1.2.2 面向对象方法的发展历史
人们普遍认为,第一种面向对象的编程语言是1967年诞生的Simula-67。它由挪威奥斯陆国家计算中心的Kristen Nygaard与Ole-Johan Dahl设计开发。尽管这种语言没有后继版本,却首先引入了类、对象、继承等概念,对后来的许多面向对象语言的设计者产生了很大的影响。
使面向对象技术进入实用化的标志是19世纪70年代诞生的Smalltalk,它是由美国施乐帕洛阿尔托研究中心(Xerox Palo Alto Research Center,PARC)的Alan Kay设计实现的。最初的版本Smalltalk-72在1972年被发布,其中正式使用了“面向对象”这个术语。PARC先后发布了Smalltalk-72、76和78等版本,直至1981年推出该语言完善的版本Smalltalk-80。Smalltalk-80的问世被认为是面向对象语言发展史上最重要的里程碑。Smalltalk-80提供了比较完整的面向对象技术解决方案,诸如类、对象、封装、抽象、继承、多态等。它是第一个完善的、能够实际应用的面向对象语言。
从20世纪80年代中期到90年代,是面向对象的程序设计语言走向繁荣的阶段。比较实用的面向对象编程语言大量涌现,如Objective C、C++、Eiffel和CLOS等语言。其中诞生于1983年的C++语言对面向对象技术的发展起到了重要作用。面向对象技术能够发展到今天,正是因为C++语言的广泛应用,它使得面向对象技术真正从实验室阶段走到了商业化阶段,当今的Java、C#等面向对象的编程语言都有C++的影子。
在20世纪80年代末90年代初,随着软件工程技术的日益成熟,面向对象的软件工程也得到了迅速发展,面向对象方法从编程发展到设计、分析,进而发展到整个软件生命周期。在此期间,大量关于面向对象方法的著作问世,并各有自己的一套概念、定义、表示法、术语和适用的开发过程。于是在它们中间出现了许多差异,这给普通用户的使用带来了很大的困惑。一些人尝试将各种方法中使用的各种概念进行统一,最终由Grady Booch、James Rumbaugh和Ivar Jacobson发起的统一建模语言(UML)在1997年11月被对象管理组织(Object Management Group,OMG)全体成员一致通过,并被采纳为标准。UML的产生标志着面向对象方法学的统一,从而为面向对象方法的应用扫清了最后一个障碍。
1.2.3 面向对象方法的基本概念
面向对象方法以类和对象作为核心,并存在着很多与之相关的原则。这些面向对象的基本概念决定了面向对象方法的本质特征。使用这些概念并遵循相关原则,才是一个真正符合面向对象思想的解决方案。下面依次对这些概念进行介绍。
1. 对象
对象(object)有着广泛的含义,难以被精确地定义。一般来说,世界上万事万物都可以看作是一个对象。这些现实中的实体也被称作客观对象。客观对象可以抽象其某些属性和方法来研究在某个问题或场景中的性质,这被称为问题对象。抽象出来的问题对象通过封装等过程成为计算机中的一个包含有数据和操作的集合体,这被称为计算机对象。三种对象之间的关系如图1-1所示。

图1-1 三种对象之间的关系
一个对象应该是一个具有状态、行为和标识符的实体,并且对象之间往往可以通过通信互相交互。一般来说,对象可以被归纳为下列四个特性。
• 自治性:即对象有一定的独立处理问题的能力,且对象自身的状态变化是不直接受到外界干预的。
• 封闭性:对象是相对封闭的。外部对象只能通过发送消息来对其施加影响,却无法直接对对象进行修改。对象隐藏了属性与操作的实现方法,只有操作声明对外部可见。
• 通信性:对象具有能与其他对象进行通信的能力。具体来说,就是对象能向其他对象发送消息,也能接受其他对象发送来的消息。对象通过通信来建立联系,并协作完成系统的某项任务。
• 被动性:虽然对象自身状态变化不受外界的直接影响,但是对象的存在和状态转换都是由外界驱动的。即只有在对象接收到外界消息后,自身才可以进行某种转换。
2. 类
对象是存在于某个时空的具体实体,而类(class)则是拥有共同的结构、行为和语义的一组对象的抽象。例如,我们可以定义一个“哺乳动物”类,则所有满足全身披毛、恒温胎生、体内有膈的脊椎动物对象都属于该类。类可以作为对象的一种描述机制,用来刻画一组对象的公共属性与公共行为,也可以用来作为程序的一个单位,用来形成程序中更大的模块。
与对象相似,类也应该具有数据、操作及标识符,并且类之间通过接口使一些操作对外可见。一般来说,类可以从以下四个角度来理解。
• 类是面向对象程序中的构造单位。一个面向对象程序就是一组相关的类。
• 类是面向对象程序设计语言的基本成分。在面向对象编程语言中,类内的成分是无法单独构成程序的,程序应该至少包含一个完整的类。
• 类是抽象数据类型的具体表现。类可以表示一种数据类型的抽象并给出了具体的数据结构表示与操作的实现方法。
• 类刻画了一组相似对象的共同特性。在面向对象程序的运行时,对象是根据类的定义而创建的,同类的对象具有相同的属性与操作。对象又被称为类的实例。
3. 抽象
抽象(abstraction)就是揭示一个事物区别于其他事物的本质特征,去除从某一个角度看来不重要的细节的行为。抽象是一个分析与理解问题的过程,它取决于使用者的目的,应该包括使用者所需要的那些问题,而忽略掉其他不相关的部分。因此抽象过程并没有唯一的答案,同一个实体在不同的场景中可能有不同的抽象。从对象到类的过程就是抽象的过程,即将所见到的具体实体抽象成概念,从而可以在计算机中进行描述并对其采取各种操作。
在面向对象中,抽象具有静态与动态的属性。例如,一个文件对象有文件名与文件内容,这些是静态的属性。而同时,在对象的生命周期中,这些属性的值是动态的——文件名与内容都可能被改变,这些就被抽象为对象的操作。
4. 封装
封装(encapsulation),即对其客户隐藏对象的属性和实现细节,仅对外公开接口,并控制在程序中属性的读和修改的访问级别。封装是软件模块化思想的体现,其目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只要通过外部接口,以特定的访问权限来使用类的成员即可。简单来说,封装强调两个概念,即独立和封闭。
• 独立是指对象是一个不可分割的整体,它集成了事物全部的属性和操作,并且它的存在不依赖于外部事物。
• 封闭是指与外部的事物通信时,对象要尽量地隐藏其内部的实现细节,它的内部信息对外界来说是隐蔽的,外界不能直接访问对象的内部信息,而只能通过有限的接口与对象发生联系。
可以说,类是数据封装的工具,而对象是封装的实现。类的成员又分为公有成员、私有成员和保护成员,它们分别有不同的访问控制机制。封装是软件模块化思想的重要体现。
5. 泛化
泛化(generalization)是类元的一般描述和具体描述之间的关系,具体描述建立在一般描述的基础之上,并对其进行了扩展。具体描述完全拥有一般描述的特性、成员和关系,并且包含补充的信息。例如,中学生是学生中具体的一种,中学生保持了学生的基本特性并加入了附加特性,二者就构成了泛化关系。实现泛化关系的机制为继承(inheritance)。一个子类(subclass)继承一个或多个父类(superclass),从而实现了不同的抽象层次,实现两者之间的泛化关系。通过这种关系,子类可以共享其父类的结构和行为,从而容易复用已经存在的数据和代码,并实现多态处理。
6. 多态
多态(polymorphism)是在同一接口下表现多种行为的能力,是面向对象技术的根本特征。具体来说,多态允许属于不同类的对象对同一消息做出不同的响应。当一个对象接收到进行某项操作的消息时,多态机制将根据对象所属的类,动态地选用该类中定义的操作。面向对象方法正是利用多态提供的动态行为特征来封装变化,适应变更,以达到系统的稳定。首先需要有泛化关系的支持,然后才能表现多态。例如,先定义一个父类“几何图形”,它具有“计算面积”的操作,然后再定义一些子类,如“三角形”“长方形”和“圆形”,它们可继承父类“几何图形”的各种属性和操作,并且在各自的定义中要重新描述“计算面积”的操作。这样,当有计算几何图形面积的消息发出时,对象会根据类的类型做出不同的响应,采用不同的面积计算公式。
1.2.4 面向对象方法的优势
面向对象方法是在传统的结构化设计方法出现很多问题的情况下应运而生的。它之所以能够被广泛认可和应用,是因为其自身的优势,这些优势体现在很多方面。
传统的结构化设计方法侧重于计算机处理事情的方法和能力,面向对象方法则从客观世界存在的事物进行抽象,更符合人类的思维习惯。这一特点能够让软件开发设计人员更有效地实现业务和系统之间的理解和转换,从而更快速、有效地解决用户问题。
在软件开发过程中,需求的不稳定性是影响软件工程的一个非常重要的因素。在现实使用时,数据和功能最容易发生改变,而对象一般则是相对稳定的。为此,使用面向对象方法可以用较稳定的对象将易变的功能和数据进行封装,从而保证较小的需求变化不会导致系统结构大的改变。
复用性也是面向对象方法带来的优势之一。面向对象方法通过封装、继承、聚合等手段,在不同层次上提供各种代码复用,以此提高软件的开发效率。
除此之外,面向对象方法还有改善软件结构、增强扩展性、支持迭代式开发等优势。这些优势使得面向对象方法得到了更广泛的应用。