第七章 面向对象的系统开发杜永林 1
第 7章
面向对象的系统开发
第七章 面向对象的系统开发杜永林 2
第七章 面向对象的系统开发
7.1面向对象的基本概念与特征
7.2面向对象的系统开发原理与步骤
7.3面向对象分析( OOA)
7.4面向对象设计( OOD)
7.5面向对象的程序设计语言( OOPL)
第七章 面向对象的系统开发杜永林 3
7.1面向对象的基本概念与特征
7.1.1面向对象的基本概念
7.1.2面向对象的基本特征
第七章 面向对象的系统开发杜永林 4
7.1.1面向对象的基本概念
7.1.1面向对象的基本概念
面向对象技术的研究近几年来已经得到很大
的发展,但是,迄今为止,对面向对象技术还没
有一个明确的定义。一般认为,在软件开发中使
用对象、类和继承等概念就是面向对象技术, 其
实涉及领域非常广泛,包括软件开发时使用的方
法学,软件开发实现阶段所使用的语言、数据库
等。面向对象技术还渗入人工智能,操作系统,
并行处理等各个研究领域。作为面向对象技术的
核心,对象、类和继承以及其他一些概念的确切
含义如何,是计算机界一直比较关心的话题,但
迄今还没有一个标准的定义。
第七章 面向对象的系统开发杜永林 5
1、对象
对象( Object)是面向对象系统中的核
心概念。如果不能正确地认识和定义它,
就无法掌握面向对象的理论。理解面向对
象的理论,必须从最基本的概念入手,通
过对最基本的概念的掌握,真正认识面向
对象方法的作用。
第七章 面向对象的系统开发杜永林 6
( 1)对象的定义
对象具有两方面的含义,即在现实世界中的含义和在
计算机世界中的含义。一个对象既可以非常简单,又可
以非常复杂。复杂的对象往往可由若干简单对象组合而
成。
“对象”的特性:
①有一个名字以区别于其他对象;
②有一个状态用来描述它的某些特征;
③有一组操作,每个操作决定对象的一种功能或行为;
④对象的操作可分为两类:一类是自身所承受的操作,一类是
施加于其他对象的操作。
由此,对象可以看做其自身所具有的状态特征及可以对
这些状态施加的操作结合在一起所构成的独立实体。
第七章 面向对象的系统开发杜永林 7
( 2)对象的状态
一个对象之所以能在现实世界中独立
存在,是因为它具有自身的状态,即自身
所具有的那些特征。由于这些状态的存在,
使其能对自身及外界对象施加操作。当然
一个对象的这些状态并不是完全用来直接
为外界服务的,但它们本身是能够为外界
服务的基础。
第七章 面向对象的系统开发杜永林 8
( 3)对象的特征
对象从形式上看,是系统程序员、应
用程序员或用户所定义的抽象数据类型的
变量;当用户定义一个对象,就创造了具
有丰富内涵的新的抽象数据类型。它是构
成和支撑整个面向对象程序设计的细胞和
基石。它具有下述三个特性。
第七章 面向对象的系统开发杜永林 9
① 模块独立性。
从逻辑上看,一个对象是独立存在的模块。
从外部看这模块,只需了解它具有哪些功能,至
于它如何实现这些功能和使用哪些局部数据来完
成它们,则都“隐蔽”在模块内部。这意味着模
块内部状态不因外界的干扰而改变,也不会波及
其他模块;模块间的依赖性极小或几乎没有;各
模块可以独立地为系统所组合选用,也可被程序
员重用,而不必担心波及或破坏其他模块。
第七章 面向对象的系统开发杜永林 10
② 动态连接性。
客观世界中各式各样的对象,并不是
孤立存在的,它们之间是有联系的。正是
它们之间的相互作用、联系和连接,构成
世间各种不同的系统。同时,在面向对象
程序设计中,通过消息激活机制,把对象
之间动态联系在一起,使整个机体运转起
来,便称为对象的连接性。
第七章 面向对象的系统开发杜永林 11
③ 易维护性。
由于对象的功能被“隐蔽”,好像被
一层封装壳保护在对象内部,所以修改、
完善功能及其实现的细节都被局限于该对
象的内部,不会波及外部,这就使得对象
和整个系统变得非常容易维护。
第七章 面向对象的系统开发杜永林 12
2、类
类 ( Class)是面向对象系统中最重要的概念,
面向对象程序设计中的所有的操作都归结为对类
的操作。在面向对象程序设计中因为引入类的概
念,使得它与传统的结构化程序设计明显地区分
开来。
把众多的事物归纳、划分成一些类,是人类在
认识客观世界时经常采用的思维方法。分类所依
据的原则是抽象,即忽略事物的非本质特征,只
注意那些与当前目标有关的本质特征,从而找出
事物的共性:把具有共同性质的事物划分为一类,
得出一个抽象的概念。
第七章 面向对象的系统开发杜永林 13
( 1)类的定义
在面向对象的方法学中,类是具有相同属性和服务的一组对象
的集合。它为属于该类的全部对象提供统一的抽象描述,其内部包括属性和服务两个主要部分。 类的作用是定义对象。
对象既具有共同性,也具有特殊性 。 运用抽象的原则舍弃对象
的特殊性,抽取其共同性,则得到一个适应一批对象的类。如果在
这个类的范围内考虑定义这个类时舍弃的某些特殊性,则在这个类
中只有一部分对象具有这些特殊性,这些对象彼此是共同的,于是
得到一个新的类,它是前一个类的子集,称做前一个类的特殊类,
而前一个类称做这个新类的一般类,这是从一般类发现特殊类。也
可以从特殊到一般:考虑若干类所具有的彼此共同的特征,舍弃它 们彼此不同的特殊性,则得到这些类的一般类。
一般类和特殊类是相对而言的。 它们之间是一种真包含的关系,
即特殊类是一般类的一个真子集。如果两个类之间没有这种关系,
就谈不上一般和特殊。特殊类具有它的一般类的全部特征,同时又 具有一些只适应于本类对象的独有特征。
第七章 面向对象的系统开发杜永林 14
( 2)类与实例的关系
类与对象的关系如同一个模具与用这个模具铸造出
来的铸件之间的关系。类给出了属于该类的全部对象的
抽象定义,而对象则是符合这种定义的一个实体。所以,
一个对象又称做类的一个实例( Instance),也有人把类
称做对象的模板( Template)。所谓“实体”或“实例”
意味着什么呢?最现实的一件事是:在程序中,每个对
象要有自己的存储空间,以保存它们自己的属性值。我
们说同类对象具有相同的属性与服务,是指它们的定义
形式相同,而不是说每个对象的属性值都相同。
对于同一类的不同实例之间,必定具有如下特点:相
同的操作集合;相同的属性集合;不同的对象名。
第七章 面向对象的系统开发杜永林 15
3、消息
对象与对象之间不是彼此独立的,它
们之间存在着联系。在面向对象系统中,
对象之间的联系是通过消息( Message)
传递的。
第七章 面向对象的系统开发杜永林 16
( 1)消息的定义
面向对象方法学中对消息的定义是,消息就是向对
象发出的服务请求,它应该含有下述信息:提供服务的
对象标识,服务标识,输入信息和回答信息。
消息是对象之间相互请求或相互协作的途径,要求某
个对象执行其中某个功能。通常,把发送消息的对象称
为发送者,接收消息的对象称为接收者。对象间的联系,
只能通过传送消息来进行。对象也只有在收到消息时,
才被激活。被激活后的对象代码将“知道”如何去操作
它的私有数据,去完成所发送的消息要求的功能。
第七章 面向对象的系统开发杜永林 17
( 2)消息的性质
① 同一对象可以接收不同形式的多个消息,
产生不同的响应;
②相同形式的消息可以送给不同对象,所
做出的响应可以是截然不同的;
③消息的发送可以不考虑具体的接收者,
对象可以响消息,也可以对消息不予理
会,对消息的响应并不是必须的。
第七章 面向对象的系统开发杜永林 18
7.1.2面向对象的基本特征
面向对象系统最突出的特性就是封装
性,继承性和多态性。衡量某种程序设计
语言,看它是否是面向对象的程序设计语
言,主要看它是否具有这三种特性。
第七章 面向对象的系统开发杜永林 19
1、封装性
( 1)封装的含义
封装( Encapsulation)是面向对象方法的一个重要原则。它有两个
含义:一是把对象的全部属性和全部服务结合在一起,形成一个不可分
割的独立单位(即对象)。第二个含义也称“信息隐蔽”,即尽可能隐
蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),只保
留有限的对外接口,使之与外部发生联系。这主要是指对象的外部不能
直接地存取对象的属性,只能通过几个允许外部使用的服务与对象发生 联系。
封装的定义是:把对象的属性和服务结合成一个独立的系统单位,尽
可能隐蔽对象的内部细节。
在程序设计中,封装是指将一个数据和与这个数据有关的操作集合
放在一起,形成一个能动的实体 ——对象,用户不必知道对象行为的实
现细节,只需根据对象提供的外部特性接口访问对象即可。因此,从用
户的观点来看,这些对象的行为就像包含在一个“黑匣子”里,是隐蔽 的、看不见的。
第七章 面向对象的系统开发杜永林 20
( 2)封装的条件
封装应该具有下面三个条件。
①具有一个清楚的边界,对象的所有私有数据、
内部程序(成员函数)细节都被固定在这个边
界内。
②具有一个接口,这个接口描述对象之间的相互
作用、请求和响应,它就是消息。
③对象内部的实现代码受到封装壳的保护,其他
对象不能直接修改本对象所拥有的数据和代码。
第七章 面向对象的系统开发杜永林 21
( 3)协议
协议是一个对象对外服务的说明,它声明这个
对象可以为外界做什么。它是由一个对象能够接受
并且愿意接受的所有信息构成的对外接口。也就是
说,请求对象进行操作的惟一途径就是通过协议中
提供的消息进行的。
外界对象能够并且只能根据该对象发送协议中
所提供的消息,请求该对象服务。即使一个对象可
以完成某个功能,但它没有将该功能放入协议中,
外界对象依然不能请求它完成这个功能。 协议实际
上是一个对象所能接受的所有公有消息的集合。
第七章 面向对象的系统开发杜永林 22
( 4)面向对象系统的封装性
面向对象系统的封装性是一种信息隐藏技术。它使系
统设计员能够清楚地标明他们所提供的服务界面,用户
或应用程序员只能看见对象提供的操作功能,看不到其
中的数据或操作代码细节。从用户或应用程序员的角度
看,对象提供了一组服务,而服务的具体实现,即对象
的内部却被屏蔽封装着。
对象的这一封装机制的目的,在于将对象的使用者
与设计者分开。使用者不必知道对象行为实现的细节,
只需用设计者提供的协议,命令对象去做即可。
面向对象系统中的封装单位为对象,即主要指对对象
的封装。类概念本身也是一种封装意义。
第七章 面向对象的系统开发杜永林 23
2、继承性
继承( Inheritance)是面向对象系统中的另一
个重要的概念。前面讨论了类,这些类是孤立的,
相互之间还没有建立关系。也就是说,这些类都处
在同一级别上,是一种平坦结构。这种没有建立相
交关系的平坦结构限制了面向对象系统的设计,因
为它不允许类之间实现信息共享。在系统中有些对
象,它们有些相同但又有些差别;如果不允许类之
间建立相交关系,这些不同对象的相似之处就无法
表现出来。
第七章 面向对象的系统开发杜永林 24
( 1)继承的引入
继承意味着“自动地拥有”。就是说,特殊类中不
必重新定义在它的一般类中定义过的属性和服务,而它
却自动地、隐含地拥有其一般类的所有属性与服务。从
一般类和特殊类的定义可以看到,后者对前者的继承在
逻辑上是必然的。
一个特殊类既有自己新定义的属性和服务,又有从
它的一般类中继承的属性与服务。继承的属性和服务,
尽管是隐式的,但是无论在概念上还是在实际效果上,
都确确实实地是这个类的属性和服务;同时继承关系是
传递的。
继承具有重要的实际意义,它简化了人们对事物的
认识和描述。
继承对于软件复用是很有益的。
第七章 面向对象的系统开发杜永林 25
( 2)继承与类的关系
继承所表达的就是一种对象类之间的相互关系。它使得某
类对象可以继承另外一类对象的特征和能力。特殊类的对象拥
有其一般类的全部属性与服务,称做特殊类对一般类的继承。
若类间具有继承关系,则它们之间应具有三个特性:
①类间具有共享特征(包括数据和程序代码的共享);
②类间具有细微的差别或新增部分(包括非共享的程序代
码和数据);
③类间具有层次结构。
继承所具有的作用有两个方面:一方面可以减少代码冗余;
另一方面可以通过协调性减少相互之间的接口和界面。
第七章 面向对象的系统开发杜永林 26
( 3)继承与封装的关系
在面向对象系统中,有了封装机制以后,对
象之间只能通过消息传递进行通信。继承机制的
引入丝毫没有影响对象的封装性。
从另一个角度看,继承和封装机制还具有一定
的相似性,它们都是一种共享代码的手段。继承
是一种静态共享代码的手段,通过派生类对象的
创建,可以接受某个消息启动其基类所定义的代
码段,使基类和派生类共享这段代码。封装机制
提供的是一种动态共享代码的手段。通过封装,
可将一段代码定义在一个类中,在另一个类所定
义的操作中,可以通过创建该类的实例,向它发
送消息而启动这段代码,同样达到共享的目的。
第七章 面向对象的系统开发杜永林 27
( 4)类的层次结构
有了继承机制,就有了类的层次关系
和结构。类的层次结构是表示系统中所有
类关系的轮廓,以这种形式可以很容易地
跟踪类与基类和派生类之间的关系。
类的层次关系可以清楚有效地表示现实
世界事物的分类问题。
第七章 面向对象的系统开发杜永林 28
( 5)继承机制的特点
在面向对象系统中,引入继承机制后具有如下五个特点:
①清晰体现相关类间的层次结构关系;
②减少代码和数据的冗余度,大大增加程序的重用性;
③通过增强一致性,减少模块间的接口和界面,大大增加程序
的易维护性;
④是自动传播代码的有力工具;
⑤是在一些比较一般的类的基础上构造,建立和扩充新类的最
有效的手段。
在面向对象系统中,继承性不仅作用在对操作的继
承上,还作用在对数据内容的继承上,既具有结构特性
的继承性,又具有行为特性的继承性。
第七章 面向对象的系统开发杜永林 29
3、多态性
多态性( Polymorphism)是面向对象
系统中的又一重要特性。它描述的是同一
个消息可以根据发送消息对象的不同,采
用多种不同的行为方式。重载,虚函数,
抽象类是实现多态性的几个重要手段。
第七章 面向对象的系统开发杜永林 30
( 1)重载
在面向对象系统中,重载的含义是指
通过为函数和运算符创建附加定义而使它
们的名字可以重载。也就是说,相同名字
的函数或运算符在不同的场合可以表现出
不同的行为。
第七章 面向对象的系统开发杜永林 31
( 2)虚函数
虚函数使用户在一个类等级中可以使
用相同函数的多个版本。每个版本均属于
类等级中的不同的类。究竟使用的是哪一
个特定的版本,需要在运行中决定。
第七章 面向对象的系统开发杜永林 32
( 3)抽象类
抽象类的作用是将许多有关的类组织在一起,
提供一个公共的基类,而那些被它组织在一起的
具体的类由它派生出来。它刻画公有行为的特征,
通过继承机制传送给它的派生类。
抽象类只描述与这类对象有关的协议和消息
的部分实现,完整的实现留给它的派生类具体完
成。
抽象类不能创建具体对象的类,即不能产生
实例,只能建立它的派生类的对象。
第七章 面向对象的系统开发杜永林 33
( 4)面向对象系统的多态性
面向对象系统的多态性指的是,当不同
的对象收到相同的消息时产生不同的动作。
比如,C++语言支持两种多态性:即编译时
的多态性和运行时的多态性。编译时的多态
性是通过使用重载实现的,到底执行的哪个
重载版本在编译时就可知道,所以是相对静
态的多态性。运行时的多态性是通过虚函数
实现的,到底运行的哪个函数版本,需要在
运行时通过找出发送消息的对象来确定。编
译器在编译时采用的是动态联编手段。
第七章 面向对象的系统开发杜永林 34
7.2面向对象的系统开发原理与步骤
7.2.1面向对象的系统开发原理
现实世界的问题空间和软件的解空间之间
存在很大的距离。面向对象的系统开发就是力
图缩短这个距离。它围绕着现实世界的概念组
织模型,是一种全新的思考问题的方式。它通
过对应用领域的概念进行分类和组织,更好地
与客观世界相吻合。它鼓励软件的用户,系统
分析员,软件设计者,编程人员和管理人员之
间进行充分的信息交流。
第七章 面向对象的系统开发杜永林 35
7.2.2面向对象的系统开发生命周期
? 在以往的管理信息系统开发中,系统生
命周期是瀑布式的,它把系统的开发过
程分解为分析、设计、实施、测试和维
护五个阶段。面向对象的系统开发生命
周期与瀑布式系统开发生命周期有所不
同,它由四个阶段组成,每个阶段都可
以相互反馈,整个过程是一种迭代、渐
增的开发过程。
第七章 面向对象的系统开发杜永林 36
1、分析阶段
? 面向对象分析( OOA,Object-Oriented
Analysis)是从问题域中选出词汇,建立
类和对象的模型世界。
第七章 面向对象的系统开发杜永林 37
2、设计阶段
? 面向对象设计( OOD,Object-Oriented
Design)是对问题域的行为进行关键抽
象再分解的过程。设计的结果反馈到分
析上进行修正。当关键抽象足够简单,
不需要再分解时即可停止设计。
第七章 面向对象的系统开发杜永林 38
3、演化阶段
? 演化实际上是由面向对象程序设计
( OOP,Object-Oriented Programming)
测试和集成组合在一起的阶段。
第七章 面向对象的系统开发杜永林 39
4、维护阶段
? 维护是在系统提交运行之后的变更活动。
第七章 面向对象的系统开发杜永林 40
7.2.3面向对象系统开发中的图示
符号 ——对象关系图
? 在面向对象程序设计( OOP)中,就内部操作而言,一个对
象本身有不足的地方不是关键问题。这容易察觉也容易修正,
可以随时进行改进,甚至在系统运行时也可改进。因为这一
改动是限定在一个特定的对象类中的,不会对整个系统产生
大的损伤。不同对象间通信上的不足通常是设计当中较为严
重的问题。若再进行改动或扩充时,对象之间的消息传递将
是非常困难的事情,因为它所波及的面比较大。若消息能力
不足,就很难正常启动系统运行。
? 对象关系图就是为了确定系统设计中的消息通信是否完整而
设计的。它既包括对象类之间的结构关系,又包括相互消息
传递的对象之间的动态关系。
? 使用对象关系图,可以发现设计中的错误,特别是那些有关
对象间关系的错误;作为实际应用编码的依据:用于系统出
问题时的调试与检错。
第七章 面向对象的系统开发杜永林 41
1、对象间的创建关系
? 对象之间的创建关系是委托关系的一种具体实现,
即一个对象在它的成员函数中创建另一个关系对象,
而后再委托它进行部分工作,最后完成自己的工作。
这种创建关系发生在一个对象实现某个方法(某种
操作功能)过程中,使用另一个对象的时候。
? 例如,对象 A在实施 M方法中创建另一个对象 B,所
以在对象 A和对象 B之间通过方法 M建立了创建关系,
称对象 A是对象 B的基于方法 M的创建者,可用图 7.3
表示这种创建关系,这是一种单个对象的创建关系。
第七章 面向对象的系统开发杜永林 42
2、对象间的聚合关系
? 对象之间的聚合关系是指一个对象是由若干其他对象
组合而成的,是一种包含关系。这种包含关系是直接
的,对象的创建不要通过一个中间方法来实现。当这
个对象被创建以后,组成它的各个对象将自动被创建。
? 例如,对象 A是由对象 1,对象 2,对象 3和对象 4这四部
分组成的。在面向对象系统中要想描述它们,可将这
四部分都定义为对象类,因为“对象 A”这个对象类由
这四部分组成。它们之间不是一种继承关系,而是一
种包含关系。这四个对象类在“对象 A”类中以成员对
象的身份存在,它们之间体现的是一种对象之间的聚
合关系,可用图 7.4给出它们之间的关系图。
第七章 面向对象的系统开发杜永林 43
3、对象间的消息流图
? 消息流图用来描述系统中对象间的消息
流,它只描述那些相关对象间交换的主
要消息。这种图能够帮助我们看到对象
是如何交互完成赋予它们的任务的。
? 消息流图有内向消息图和外向消息图两
种。
第七章 面向对象的系统开发杜永林 44
( 1)内向消息图
? 描述一个对象如何从其他对象接收消息。
例如对象 B和对象 C分别向对象 A发送了
一条消息,其消息流图如图 7.5所示。
第七章 面向对象的系统开发杜永林 45
( 2)外向消息流图
? 描述一个特定对象发送给其他对象的所
有消息,与内向消息流图正好相反。例
如对象 A分别发送了一个消息给对象 B和
对象 C,其消息流图如图 7.6所示。
第七章 面向对象的系统开发杜永林 46
7.3面向对象分析( OOA)
7.3.1面向对象分析的主要工作
7.3.2面向对象的分析方法
第七章 面向对象的系统开发杜永林 47
7.3.1面向对象分析的主要工作
和其他分析方法一样,OOA的基本出
发点是问题域和用户需求。分析员的主
要工作就是通过不断地研究问题域,建
立一个满足用户需求的系统模型。
第七章 面向对象的系统开发杜永林 48
1、需求分析
? 用户需求就是用户对所要开发的系统提
出的各种要求和期望。它包括系统的功
能,性能,可靠性,保密要求,交互方
式等技术性要求和资金强度,交付时间,
资源使用限制等非技术性要求。在多数
情况下,功能需求是分析员考虑最多的
因素。
? 研究用户需求包括以下五个活动。
第七章 面向对象的系统开发杜永林 49
( 1)阅读
阅读一切与用户需求有关的书面材料。
第七章 面向对象的系统开发杜永林 50
( 2)交流
与用户交流,搞清有关用户需求的疑
点,纠正用户不切实际的要求或不确切
的表达。
第七章 面向对象的系统开发杜永林 51
( 3)调查
有些需求问题,通过阅读和与用户的
交流,仍然不能完全明确,则需要到现
场做适当的调查,目标仅限于搞清用户
需求(更深入、详尽的调查将在分析工
作开始后展开)。
第七章 面向对象的系统开发杜永林 52
( 4)记录
随时记录通过阅读、交流和调查所
得到的认识,更要记录所存在的疑点
(有些关于需求细节的疑点,可留待对
问题域做深入调查与分析时解答)。
第七章 面向对象的系统开发杜永林 53
( 5)整理
纠正初始的需求文档中不正确或不确
切的内容,整理一份符合开发规范,并
且确定表达系统责任的需求文档。
第七章 面向对象的系统开发杜永林 54
2、系统分析
分析阶段集中于问题域的关键抽象,
明确问题中有哪些数据实体存在,它们
的意义是什么,暂时不考虑它们是怎样
处理的。在分析阶段,可分如下三个步
骤进行。
第七章 面向对象的系统开发杜永林 55
( 1)定义问题边界
? 在满足系统要求的前提下,划分问题边界很重
要的是讨论系统的应变性和稳定性,然后得出
设计的策略。
? 在系统边界以内,是系统本身所包含的对象。
在系统边界以外,是系统外部的活动者,主要
是人、设备和外系统。人,是指与系统交互的
人员。
? 问题域中的有些人员与设备,不应看做系统边
界以外的活动者。
? 认识系统边界是为了明确系统的范围以及与外
部世界的接口。
第七章 面向对象的系统开发杜永林 56
( 2)问题域的关键抽象
? 问题域的关键抽象就是找出有关系的类和对象。
任何一个抽象级的类,它的每个成员必须是相
互独立的、不可再分解的,并且类中的全体成
员都依赖于其中的一个关键成员,以建立起关
系。
? 问题域和系统责任是发现对象的根本出发点。
? 为了尽可能全面发发现系统所需要的对象,分
析员应该把握“先松后紧”的原则。
第七章 面向对象的系统开发杜永林 57
( 3)类的抽象
? 在 OOA中正确地运用抽象原则,先要舍弃那些与系统
责任无关的事物,只注意与系统责任有关的事物。
? 其次,对于与系统责任有关的事物,也不是把它们的
任何特征都在相应的对象中表达出来,而要舍弃那些
与系统责任无关的特征。判断事物是否与系统责任有
关的关键问题,一是该事物是否为系统提供一些有用
的信息,或者是否需要系统为它保存和管理某些信息;
二是该事物是否向系统提供某些服务,或者说是否需
要系统描述它的某些行为。
第七章 面向对象的系统开发杜永林 58
7.3.2面向对象的分析方法
第七章 面向对象的系统开发杜永林 59
1,Bailin的面向对象结构化分析
方法
? Bailin认为,传统的结构化分析具有很强的生命力和很
大的合理性,已经为计算机界广泛接收,并且已有许
多支持该方法的工具和环境,放弃是很可惜的。如果
把结构化分析作为分析阶段的主要方法,需要解决从
需求规格说明到面向对象设计的过渡问题。
? 结构化分析是一个对系统功能需求进行整理的方法。
? 因为聚集的原则不同,要从结构化分析过渡到面向对
象设计较为困难,需要重新构造数据流图。针对这一
情况,Bailin提出面向对象结构化分析,既能利用已有
的经济与工具,又能实现从分析到面向对象设计的平
滑过渡。
第七章 面向对象的系统开发杜永林 60
( 1) Bailin的面向对象结构化分
析的基本思想
在面向对象结构化分析中,主要概念是实
体,而不是过程。结构化设计中的过程可以是
一个有效的实体,实体所隐含的意义较过程有
所不同。在这个方法中,不是强调输入到输出
的转化,而是强调实体的“内容”。在面向对
象结构化分析中,仍然采用 DFD的形式表示输
入和输出,不同的是用实体数据流图( EDFD)
来替代传统的数据流图。 EDFD的结点分为实
体和函数两类。每个函数必须和实体相关,即
函数由实体执行,或者作用在实体上。
第七章 面向对象的系统开发杜永林 61
( 2)实体的分解
Bailin进一步将实体分为主动实体和被动
实体。主动实体被表示为数据流图的结点,而
被动实体则以数据流或数据槽的形式出现。这
里的实体为对象的同义词。低层 EDFD把每个
实体分解成一些子实体,或分解为由实体调用
的一些函数,也可能分解为两者的结合。函数
可以分解为子函数。 EDFD的层次结构包括较
高层的实体图和该实体在低层时被分为子实体
和函数的流图。
第七章 面向对象的系统开发杜永林 62
( 3)分析步骤
Bailin的面向对象结构化分析方法包
括七个步骤:①确定关键的问题 ——领
域实体,②区别主动和被动实体,③在
主动实体之间建立数据流,④把实体
(或函数)分解为子实体和 /或子函数,
⑤对新的实体进行检测,⑥在新的实体
下汇集相关函数,⑦把新实体归类到恰
当的领域。
第七章 面向对象的系统开发杜永林 63
( 4)分析结果的表现
面向对象结构化分析的结果(即面
向对象的需求规格说明)包括一个 EDFD
的层次结构和一组实体关系图( ERD)。
实体关系模型( E-R模型)可以作为此规
格说明的背景材料,为用户和开发者提
供问题领域的概貌,以及所分析的系统
范围内的一些属于技术领域的知识。
第七章 面向对象的系统开发杜永林 64
2,Sally Shlaer与 Stephen Mellor
的面向对象的分析方法
Sally Shlaer与 Stephen Mellor开发了
的面向对象的分析方法。该方法以信息
模型化方法作为基础,还为目标系统提
供了另外两个模型:一个状态模型和一
个过程模型。这三个模型从三个不同的
角度描述系统:相关的信息,状态和过
程信息,包含关于问题领域较为完整的
信息。
第七章 面向对象的系统开发杜永林 65
Sally Shlaer与 Stephen Mellor的
方法分为六个步骤:
① 开发一个信息模型;
②定义对象的生命周期;
③定义关系的动态特征;
④定义系统的动态特征;
⑤开发过程模型;
⑥定义领域和子系统。
第七章 面向对象的系统开发杜永林 66
Sally Shlaer与 Stephen Mellor的
方法准则
Sally Shlaer与 Stephen Mellor方法只是隐式
地支持面向对象的三个基本准则:分类、继承
和封装。信息模型中包含的对象和关系虽然不
与面向对象要领中对象、分类、继承、组装等
概念直接等同,但可以很方便地将 Sally Shlaer
& Stephen Mellor OOA中的概念在设计时映射
到面向对象的概念。 Sally Shlaer和 Stephen
Mellor方法还要求每个动作处理过程和相关的
动作数据流图仅与对象联系,从而保证这些操
作的封装性。
第七章 面向对象的系统开发杜永林 67
7.4面向对象设计( OOD)
第七章 面向对象的系统开发杜永林 68
7.4.1面向对象设计的步骤及设计工具
Booch是面向对象设计领域的先驱。
Booch将他的方法学看做结构化设计的一
种替代,而不是一种扩充。虽然 Booch描
述了辅助设计的许多技术与工具包括从
非形式的表列到形式的图与模板,但是
没有关于面向对象设计中各阶段的固定
工作次序。他建议分析员应采用适合于
具体问题的非形式化技术,反复地、增
量地添加形式化的图和模板中的内容。
第七章 面向对象的系统开发杜永林 69
1、设计步骤
( 1)标识类与对象
( 2)标识类与对象的语义
( 3)标识类 /对象之间的关系
( 4)实现类与对象
第七章 面向对象的系统开发杜永林 70
( 1)标识类与对象
这一过程主要是在问题领域内发现最
关键的对象,提出能使对象协同工作以
完成某些功能的重要机制。这些对象作
为候选的类和对象,随着对问题领域的
不断了解,进行更新。在这一步中,也
可通过画出对象图和类图,说明类、对
象及其相互之间的关系和作用。
第七章 面向对象的系统开发杜永林 71
( 2)标识类与对象的语义
用多种技术确定在前一步标识的类与
对象的意义,包括产生定义,对象从创
建到撤消全生存周期中的“活动情节”。
这一步骤就需要开发者以公正的态度,
经过反复考虑和仔细观察后再确定。在
这里要定义类图 /模板、对象图 /模板和操
作模板。
第七章 面向对象的系统开发杜永林 72
( 3)标识类 /对象之间的关系
建立类 /对象之间的交互,如类之间
的继承模式、对象之间的合作模式,其
结果关系整个系统的质量。同时,捕捉
对象 /类之间的可见性判定。在这一过程
中需要设计基本的模块图 /模板。
第七章 面向对象的系统开发杜永林 73
( 4)实现类与对象
构造类与对象详细的内部视图,包
括定义它们的行为(服务),将类与对
象分配到目标语言环境中定义的模块;
当目标环境支持多处理机时,还将为不
同程序分配不同处理机。在这一步中,
除了对上述图和模板进行求精外,还可
根据需要设计处理图。这一步骤还不是
最后的一环,整个软件系统的开发需要
重复整个过程。
第七章 面向对象的系统开发杜永林 74
2,Booch面向对象设计工具简介
( 1)类图 /类模板
( 2)模块图 /模块模板
( 3)对象图 /模板
( 4)操作模板
( 5)处理图 /模板
( 6)状态转换图
( 7)时序图
第七章 面向对象的系统开发杜永林 75
( 1)类图 /类模板
类是共享相同结构和行为对象的结合。类
之间有继承、实例化等关系。类图描述类的存
在和在系统逻辑设计类之间的关系。类图的结
构包括类、类间关系以及类的服务,所支持的
关系包括使用、实例化、继承、元类型和无定
义。类用虚线包围,关系用有向弧和无向弧表
示等。类模板则是对类图的比较规范的文字性
说明。类模板概括了类本身定义的说明,包括
类的可见性,类的子类和父类,类中的操作及
其操作的参数,类的持久必严的并发性和空间
复杂性等。
第七章 面向对象的系统开发杜永林 76
( 2)模块图 /模块模板
记录在系统物理设计中对象和类到模块的分配情
况。在传统的软件开发中,模块一般包括子程序、程
序包和任务。在面向对象软件系统中,模块则对应于
类和对象。对于复杂系统来说,类和对象的庞大规模
导致模块图的扩充。为了提高抽象水平,使程序员更
加了解系统的物理构造,提出“子系统”这一模块性
概念。子系统是一些相互影响的类、对象等按一定条
件有机地组合在一起,完成某些特定功能的实体。模
块图表示类、对象以及子系统、模块之间的关系。模
块、模板则对模块图进行说明,还说明模块的静态含
义和动态含义。静态含义主要说明分配给该模块的最
主要的类和对象情况。若有特殊需要的话,通过处理
图或时序图类描述它们的动态含义。
第七章 面向对象的系统开发杜永林 77
( 3)对象图 /模板
对象图用于对对象的某些动态特征进行模
型化。对象图主要描述了对象、对象的可见性
以及对象之间的消息传递。在对象图中,对象
用实线包围,由有向弧连接,有向弧定义了对
象的可见性和消息传递,但不显示控制流或事
件的顺序。由于对象与类有着概念上的联系,
因此,类图和对象图定义不能有相互矛盾。对
象模板是对对象图的正文描述,除此之外,还
描述了对象所属的类,对象的持久性、操作对
象、消息发生的频率等。
第七章 面向对象的系统开发杜永林 78
( 4)操作模板
操作模板是对类和对象中的操作提
供详细设计文档的结构化正文,以及操
作所属的类或对象、操作的参数等,由
于操作和类、对象等有紧密关系,因而
在描述中不能有矛盾。
第七章 面向对象的系统开发杜永林 79
( 5)处理图 /模板
用以表示在系统物理设计时,各个
处理分配处理机情况,此仅用于多机处
理机环境内的实现。处理图主要画出处
理器、设备和它们之间的通信。处理模
板除了提供处理图的文字描述外,还提
供一些信息,如处理器的处理能力,如
何对分配给该处理器的过程进行优化,
以及过程说明、过程设计调度、设备和
通信介绍。
第七章 面向对象的系统开发杜永林 80
( 6)状态转换图
状态转换图主要表示建模类状态和
状态转换,它显示类的状态,引起状态
转换的事件,以及状态转换引起的动作,
状态用圆表示,事件用有向弧表示,状
态转换图显示了类和对象的动态变化。
第七章 面向对象的系统开发杜永林 81
( 7)时序图
对象图的辅助图,表示控制流和在一
组互相合作的对象中事件的顺序。它以
时间为横轴,而纵轴则表示不同的对象,
整个时序图描述了在不同时刻为不同对
象进行的不同消息操作,还表示出对象
创建、消亡的生命周期过程。
第七章 面向对象的系统开发杜永林 82
7.4.2面向对象的设计体系
第七章 面向对象的系统开发杜永林 83
1、概述
? 20世纪 80年代末以来,面向对象技术成为研究的热点,
? 面向对象方法都支持三种基本的活动:识别对象和类,描
述对象和类之间的关系,以及通过描述每个类的功能定义
对象的行为。
? 当重要的对象被发现后,通过一组互相关联的模型详细表
示类之间的关系和对象行为,这些模型从四个不同的侧面
表示软件的体系结构:静态逻辑、动态逻辑、静态物理和
动态物理。
? 静态逻辑模型描述实例化(类成员关系)、关联、聚集
(整体 /部分)、和一般化(继承)等关系,称为对象模
型。
? 动态逻辑模型描述对象之间的互相作用。
? 静态物理模型通过模块描述代码的布局。动态物理模型描
述软件的进程和线程体系结构。
第七章 面向对象的系统开发杜永林 84
2,Booch方法
Booch方法中用对象交互作用图描述
重要的互相作用,显示参与的对象和对
象之间按时间排序的消息。用可见性图
描述互相作用中对象的可见性。对象的
可见性定义一个对象如何牌向它发送消
息的方法的作用域之中。例如,它可以
是方法的参数、局部变量、新的对象、
或当前执行方法的对象的部分。
第七章 面向对象的系统开发杜永林 85
( 1) Booch方法的步骤
Booch方法的过程包括四个步骤:①
在给定的抽象层次上识别类和对象,②
识别这些对象和类的语义,③识别这些
类和对象之间的关系,④实现类和对象。
这四种活动不仅仅是一个简单的步骤序
列,而是对系统的逻辑和物理视图不断
细化的迭代和渐增的开发过程。
第七章 面向对象的系统开发杜永林 86
( 2) Booch方法的特点
在面向对象的设计方法中,Booch强
调基于类和对象的系统逻辑视图与基于
模块和进程的系统物理视图之间的区别。
他还区别了系统的静态和动态模型。然
而,他的方法偏向于系统的静态描述,
对动态描述支持较少。
第七章 面向对象的系统开发杜永林 87
( 3) Booch方法的符号体系
? Booch方法的力量在于其丰富的符号体系,包括类图
(类结构 -静态视图)、对象图(对象结构 -静态视图)、
状态转移图(类结构 -动态视图)、时态图(对象结构 -
动态视图)、模块图(模块体系结构)、进程图(进
程体系结构)等。
? 用于类和对象建模的符号体系使用注释和不同的图符
(如不同的箭头)表达详细的信息。 Booch建议在设计
的初期可用符号体系的一个子集,随后不断添加细节。
对每个符号体系还有一个文本的形式,由每个主要结
构的描述模板组成。符号体系有大量的图符定义,但
其语法和语义并没有严格地定义。
第七章 面向对象的系统开发杜永林 88
2,Rumbaugh的 OMT方法
第七章 面向对象的系统开发杜永林 89
( 1) OMT方法的三种模型
? Rumbaugh的 OMT方法从三个视角描述系统,相应地提
供三种模型:对象模型、动态模型和功能模型。
? 对象模型描述对象的静态结构和它们之间的关系。主
要的概念包括:类、属性、操作、继承、关联(即关
系)与聚集等。
? 动态模型描述系统那些随时间变化的方面,其主要概
念有状态、子状态和超状态、事件、行为、活动等。
? 功能模型描述系统内部数据值的转换,其主要概念有
加工、数据存储、数据流、控制流与角色(源 /潭)。
第七章 面向对象的系统开发杜永林 90
( 2) OMT方法的开发过程
该方法将开发过程分为分析、系统设
计、对象设计与实现四个阶段。
第七章 面向对象的系统开发杜永林 91
3,Coad/Yourdon方法
Coad/Yourdon方法严格区分面向对象
分析 OOA和面向对象设计 OOD。
第七章 面向对象的系统开发杜永林 92
( 1) Coad/Yourdon方法的五个层次
① 发现类及对象。
②识别结构。
③定义主题。
④定义属性。
⑤定义服务。
在面向对象分析阶段,经过五个层次的活
动后的结果是一个分成五个层次的问题域模型,
包括主题、类及对象、结构、属性和服务五个
层次,由类及对象图表示。五个层次活动的顺
序并不重要。
第七章 面向对象的系统开发杜永林 93
( 2)面向对象设计模型的组成
面向对象设计模型需要进一步区分以下四
个部分。
①问题域部分( PDC)
②人 -机交互部分( HIC)。
③任务管理部分( TMC)。
④数据管理部分( DMC)。
第七章 面向对象的系统开发杜永林 94
4,Jacobson方法
Jacobson方法与上述三种方法有所不
同,它涉及整个软件生命周期,包括需
求分析、设计、实现和测试等四个阶段。
需求分析和设计密切相关。
第七章 面向对象的系统开发杜永林 95
( 1)需求分析和设计
? 需求分析阶段的活动包括定义潜在的角色(角
色指使用系统的人和与系统互相作用的软、硬
件环境),识别问题域中的对象和关系,基于
需求规范说明和角色的需要发现 use case,详细
描述 use case。
? 设计阶段包括两个主要活动,从需求分析模型
中发现设计对象,以及针对实现环境调整设计
模型。第一个活动包括从 use case的描述发现设
计对象,并且描述对象的属性、行为和关联。
在这里还要把 use case的行为分派给对象。
第七章 面向对象的系统开发杜永林 96
( 2)对象与行为的描述
在需求分析阶段的识别领域对象和关系的
活动中,开发人员识别类、属性和关系。关系
包括继承,熟悉(关联),组成(聚集)和通
信关联。定义 use case的活动和识别设计对象的
活动,两个活动共同完成行为的描述。
Jacobson方法还将对象区分为语义对象(领域
对象),界面对象(如用户界面对象)和控制
对象(处理界面对象和领域对象之间的控制)。
第七章 面向对象的系统开发杜永林 97
( 3) use case模型
? 在该方法中的一个关键概念就是 use case。 use case是指行为相关
的事务( transaction)序列,该序列将由用户在与系统对话中执行。
因此,每个 use case就是一个使用系统的方式。当用户给定一个输
入,就执行一个 use case的实例,并且引发执行属于该 use case的
一个事务。基于这种系统视图,Jacobson将 use case模型与其他五
种系统模型关联。
? 领域对象模型,use case模型根据领域来表示。
? 分析模型,use case模型通过分析来构造。
? 设计模型,use case模型通过设计来具体化。
? 实现模型:该模型依据具体化的设计,实现 use case模型。
? 测试模型:用来测试具体化的 use case模型。
第七章 面向对象的系统开发杜永林 98
7.5面向对象的程序设计语言( OOPL)
?,实现”在某种意义上可以看做是设计过程的延伸。由于许多困难
的决策已经在设计阶段解决,“实现”应该是一个相对直接和机
械的过程。从某种意义上说,传统的程序设计语言与数据库语言
都能作为面向对象软件开发的实现语言。由于面向对象的程序设
计语言与面向对象的数据库语言直接支持面向对象的概念,因此
采用面向对象语言和面向对象数据库作为面向对象软件开发的实 现工具,无疑是最自然、最合适的选择。
? 在应用开发中,用户界面是大多数应用的重要部分,战友有很大
一部分工作量。面向对象的用户界面不仅为用户提供方便,用户
仅凭直觉和常识揄就能够操作应用,而且高级的面向对象用户界
面开发工具,大大减轻了应用开发人员的负担。应用开发人员可
在专门的类库中找到界面系统中重要组成部分的抽象描述,并且
直接使用这些预制的成分或通过创建子类,开发满足其特殊需要 的组件。
第七章 面向对象的系统开发杜永林 99
7.5.1面向对象程序设计语言及其
演变历史
? 程序设计语言的发展经历了好几个阶段。 20世纪 40年代,由于硬件资源昂贵,除了计算之外
的工作都被看做一种浪费,人们基本上无暇顾及程序设计语言。 50年代,第一代程序设计语
言提出了许多有价值的概念,如算术表达式、语句、数组、表、堆栈等。这一时期硬件的大 幅度降价以及性能的提高,加上 FORTRAN等高级程序设计语言研制成功,拨开了围绕在高级
语言价值问题周围的疑云。 50年代末,60年代初,出现许多至今仍广泛使用的语言,如
Algol60,Cobol61,Lisp等。这个时期一般被认为是程序设计发展的第二代。 60年代中、后期,
以 PL/1和 Algol68为代表的第三代语言试图用统一的语言替代各种第二代语言。由于目标太大
和当时的条件限制,总的来说是失败的。 70年代,程序设计语言的研究则是对语言设计目标
的重新评估。特别是 60年代末的软件危机,改变了语言的设计目标。语言设计的目标从表示
能力转移到程序结构。在微观上,结构化的 while循环替代了 goto,结构化的程序设计成为一
个时髦的名词。在宏观上则强调程序的模块化,先是通过函数和过程,后是采用对象和抽象。 80年代,对语言的研究不再停留在对单个语言的研究之上,开始研究由一类语言组成的语言
范畴:如 Pascal等基于对象的范畴;并发,分布式范畴;函数型程序设计语言范畴;逻辑程序
设计语言范畴和数据库语言范畴。
? 今天说的面向对象的程序设计语言则属于基于对象的语言范畴。 Peter Wegner将基于对象语言
范畴进一步划分为基于对象的、基于类的和面向对象的。
? 基于对象的语言中,对象是“一类值”的表示,即可以对它赋值,作为参数传递和作为一个
结构的成分,但不支持类的概念。基于类的语言要求任何对象都从属于某个类,但不支持类 的继承。面向对象的语言则必须支持类的继承关系。
? 目前,面向对象语言的普及主要归功于对 C和 Pascal这两个流行语言面向对象的扩充。 C++的
普及不仅在于 C语言的普及,而且在于其良好的性能。 C++代码性能几乎可与 C编译器产生的
代码的性能媲美。
第七章 面向对象的系统开发杜永林 100
7.5.2面向对象语言的特征
面向对象的语言尽管都支持诸葛亮如对象与继承等核心的
面向对象的概念,但它们在程度与方法上存在着差异,并且大多
数语言还不同程度地支持其他一些重要的语言特征,即一些与面
向对象密切相关的概念与机制。这些重要的语言特征往往是选择
合适的实现语言的关键。如果设计中选择了多重继承,最好选择
一个能够很好地支持多重继承的面向对象的语言。解释型的语言
适合快速原型,但不能很好地满足严格的时间需求。提供丰富类
库的语言会减轻实现工作的负担。如果需要额外的编译时的错误
检查,则最好使用一个强类型语言。如果内存的使用在应用中至
关重要,可以选择一个提供自动废料收集的语言。如果应用要求
多用户共享持久数据,可以使用一个面向对象的数据库系统。下 面就各种面向对象语言的特征做简单的介绍。
第七章 面向对象的系统开发杜永林 101
1、多重继承
? 许多语言,如 C++,CLOS,Biffel和 DSM都支
持多重继承。若在设计中使用了多重继承,那
么选择支持多重继承的语言可以实现从设计到
实现的直接转换,否则必须对设计进行修改。
? 多重继承可能带来属性与方法的同名冲突。一
个类可以有多个具有同名属性和同基调方法的
祖先。不同的语言在消除同名冲突时,采取不
同的策略。多重继承的一个准则,是在任何情
况下都应避免这种冲突,因为依赖编译器解决
冲突会造成语义上的错误和混淆。
第七章 面向对象的系统开发杜永林 102
2、类库
? 大多数语言都提供由类属类( generic class)组成的类
库。
? 实现者可以直接使用这些类或通过创建子类,满足其
特性的要求。有了类库的支持意味着许多组件无需程
序员自己重新开发。
? 一类非常有价值的类是集合、动态数组、表、队列、
栈、词典、树等通用数据结构。它们可以作为组织其
他对象的框架。类库中同样也应包含表达各种联系的
类。另一些有用的类是支持多种窗口系统的类,它们
通常组织成专门的、独立的类库。这种专门的类库中
还包括针对字符处理的类库。
第七章 面向对象的系统开发杜永林 103
3、效率
? 早期的面向对象语言,如 Smalltalk 和基于 LISP语言的解释实现,造成面向对象语
言实现效率欠佳的名声。事实上,目前许多编译实现的语言其特性可与传统的过
程式语言的性能相媲美。这为面向对象的实现人员提供更多的选择余地。具有成
熟类库的语言由于在构造类库时,针对性能问题精心地选择数据结构与算法,其
代码的执行速度往往会比非面向对象语言更快。
? 影响面赂对象语言执行效率的一个重要方面,是动态联编或运行方法归结。这似
乎需要在运行时检索类继承结构,寻找实现给定对象中某个方法的类。大多数面
向对象语言都优化了这种检索机制。
? 在像 C++之类的强类型语言的实现中,运行时的方法归结可归纳为简单的结构引
用,这种方法几乎与过程调用一样高效。在 C++的实现中,每个类都有一个包含
所有该类对象可访问方法的结构。在结构中的可知位置上存放指向每个方法的指
针,每个对象都存放指向其类的方法结构的指针。运行时的方法归结通过用方法
的相对位置检索方法结构来完成。这种技术不能用于运行时能够创建新方法的语
言,因为这样将无法静态地确定“方法”的相对位置。
? 另一种优化运行时方法归结法是为编译器提供足够的信息。提供信息可采取两种
方式:一种是由程序员显式地说明哪些方法是重载的,仅对这些重载的方法执行
运行时方法归结,C++的虚函数和 CLOS的类属函数就体现了这种方式;另一种方
法是在编译的最后增加一个优化过程,分析整个应用,判定哪些方法不是重载的,
并且利用这些信息来重新编译应用。 Biffel语言的编译就采用了后一种方式。为变
量说明类型,可以帮助编译器更精确地决定应该对那些方法调用进行优化。
第七章 面向对象的系统开发杜永林 104
4、内存管理
? 面向对象中自由地创建与访问对象,对存储管理提出了更高的要求。大多
数面向对象的语言都从一个堆而不是主存中固定的块或栈分配存储空间,
除非能对不再使用的对象进行回收。否则,无论存储空间有多大,动态的
存储分配都会出现空间分配用完的问题。回收最关键的问题是如何判断某
个对象不再有用或不能再被访问,这依赖于应用的类型和采用的存储体系
结构。许多能够访问大容量虚存的应用可以忽略回收的问题。对于长时间
运行的高度交互式的应用,无论有多大的内存空间,都必须考虑内存管理 的问题。
? 有两种内存管理策略:一是由程序运行时系统自动地完成;二是由程序员
显式地书写回收语句。一般比较倾向于使用自动的存储管理,这样可以减
轻程序员的负担。大多数自动的废料收集机制的效果不尽人意,会造成运
行的长时间等待。避免这一情况的方法是采用增量的废料收集策略,但会 增加平均等待时间。
? CLOS和 Smalltalk都提供全自动的废料收集。 C++则要求程序员显式地回收
不再使用的对象。 C++程序员定义析构( Destructor)函数,当变量超出辖
域时自动执行这些析构函数。这为程序员提供使用显式的内存回收途径,不再产生对象挂空、不能再被回收的情况。
第七章 面向对象的系统开发杜永林 105
5、封装
? 封装分离了对象的接口和对象的内部实现细节。它可减少程
序的耦合性,避免因为小小的修改而引起的大规模连锁反应,
可对对象的实现细节进行修改而不影响对象的使用者(对象
的客户)。不同的语言对封装的支持程度存在一些差异。
? 损害封装的一种情况是允许一个类的代码直接访问另一个类
的属性。直接访问意味着访问类应该知道被访问类的存储格
式和数据的位置,而这些实现细节应该是隐藏在类中的。有
时某些类的属性的值确实需要用到其他类的信息,但不应直
接访问而应通过向其他对象发送消息来取得这些信息。许多
语言,如 Smalltalk,禁止对另一个对象属性的直接访问。另
一些语言,如 C++,则可显式地定义属性是私有的还是公共
的。 Eiffel通过其 export语句对封装提供最为细致的控制,
export列出了可访问的属性和可见的操作。 C++可通过友元说
明,有限制地放松对封装的要求,增加灵活性。
第七章 面向对象的系统开发杜永林 106
? 封装还会因为使用继承不小心而受到破坏。子
类继承父类的属性时,如果子类直接访问从父
类继承来的属性,父类的封装性就被破坏了。
CLOS,owl,Eiffel和 C++允许限制其子类对它
的可见度。尽管有人倾向于子类能够访问超类,
但这必将造成类与类之间耦合过分密切。
? 有时可以通过编制一些私有的内部操作,供该
类中的其他方法使用,且使其他类不能使用它
们。但大多数情况仅仅简单地区别公共的还是
私有的属性与操作是不够的。一些语言提出了
第三种对访问的限制,如 C++中的受保护
( protected)说明。
第七章 面向对象的系统开发杜永林 107
6、打包
? 类对于组织大型的系统而言,其能力是有限的。大多
数面向对象语言缺乏用于控制对象之间可见性的分解
机制。面向对象语言中的一个突出问题是要求类名在
整个应用中惟一,而在多个人员协调开发应用的情况
下,会出现与块结构语言类似的名冲突问题。
? 在 Ada和 CLOS语言中,包块机制能将系统分解成具有
独立的名字空间的系统组成成分。除非显式地指明,
在 Ada中包块规格说明中的名字在包块外是不可见的。
这样,就能很好地控制名字空间和包块间的依赖关系。
在包块内还可以对包块外的实体重新命名。包块可以
嵌套,使整个系统封装在一个定义良好的界面内。
? 面向对象的语言同样得益于打包( packaging)能力。
特别是包块的嵌套能力,可以更好地控制系统各组成
部分的可见性。
第七章 面向对象的系统开发杜永林 108
7.5.3面向对象的语言 C++
? C++是 AT&T Bell实验室的 Bjarne Stroustrup于 80年代早期给出
的,是迄今为止商业上最受欢迎的面向对象的语言。 C++是
一个混合型语言,不是所有的实体都是对象。 C++是对 C语言
的扩充。它不仅为 C语言增加了面向对象的能力,而且弥补
了许多原始 C语言的不足。 C++中有许多正统的面向对象的成
分,如函数的重载和函数的原型。
? C++是强类型语言。 C++超初的实现是将 C++转换成标准 C语
言的预处理器,但是 C++预处理器实现为符号排队错带来了
困难。目前,C++已有真正的编译器,具有支持具有继承和
动态联编特性对象的符号排错器。供应商们提供了 C++在许
多操作系统上的实现方法。 Free Software Foundation甚至免费
提供带排错器和类库的 C++编译器。
第七章 面向对象的系统开发杜永林 109
? 虽然 AT&T发布的标准包含了 I/O,协同例程( co
routine),任务( tasking)和复杂算术的类库,
但 C++并没有标准的类库,也不将其作为环境的
一部分。许多开发人员为 C++开发了类库,但这
些类库可能不兼容。
? C++对类的属性和操作的访问提供了良好的控制。
属性和操作可以说明成公开的( Public),对任
何函数的访问开放;也可说明成受保护的
( Protected),仅限于该类子类方法对它的访问;
或说明成私有的( Private),仅对该类自身的方
法的访问开放。 C++还可利用友元( Friend)说
明,使访问对某个特定的类或函数开放。
第七章 面向对象的系统开发杜永林 110
? 与 C语言一样,C++的文法很不自然,其语法的分析
非常困难。 C++还支持重载操作符,即各方法共享
相同的名字,但参数的个数和类型可以不同。 C++
支持多种存储分配策略;由编译器静态分配、基于
栈的和运行时基于堆的存储分配。程序员应当避免
混淆不同存储类型的对象和防止挂空的引用。每个
类可有多个构造和转换函数,用于初始化新的对象
和为赋值和参数传递执行类型转换。这些概念虽然
语义明确,但使用起来很容易混淆。
? 总之,C++是既复杂又灵活的语言。它着重于在实
现的早期发现错误和选择不同的实现策略,通过付
出一些灵活性和简单性的代价,换取运行时的高效
率。