天天看点

《面向对象分析与设计》一1.3面向对象的基本原则

面向对象的基本原则主要有抽象、分类、封装、消息通信、多态性、行为分析和复杂性控制。

(1)抽象

抽象(abstraction)是指从事物中舍弃个别的、非本质的特征,而抽取共同的、本质特征的思维方式。在面向对象方法中,可从几个方面来理解抽象:

1)编程语言的发展呈现抽象层次提高的趋势。例如,用c++编程,不用考虑cpu寄存器和堆栈中存放的内容,因为大多数编程语言都是从这些细节中抽象出来的。对于一个完成确定功能的语句序列,其使用者都可把它看作单一的实体(如函数),这种抽象就是过程抽象。在面向对象编程语言中,存在着过程抽象和数据抽象。在类的范围内,使用过程抽象来形成操作。数据抽象是指把数据类型和施加在其上的操作结合在一起,形成一种新的数据类型。类就是一种数据抽象,栈也是一种数据抽象。

2)在面向对象方法中,对象是对现实世界中事物的抽象,类是对对象的抽象,一般类是对特殊类的抽象。有的抽象是根据开发需要进行的。例如,就对象是对现实世界中的事物的抽象而言,高校中的学籍管理系统和伙食管理系统中所使用的学生的信息就是不一样的;再如,一个现实事物可能要担任很多角色,只有与问题域有关的角色,在系统中才予以考虑。

3)在面向对象的不同开发阶段需要进行不同程度的抽象。典型地,在面向对象分析阶段,先定义类的属性和操作,而与实现有关的因素在设计阶段再考虑。例如,对自动售货机建模,在分析阶段先定义一个类“自动售货机”,根据其收钱和发货的职责定义其属性和操作,其中对外提供的操作为收钱口、选择按钮和发货口(三者形成一个接口),而对于如何根据实现条件来设计它的内部细节是设计阶段的任务。这与现实生活中一样,我们可以在较高的抽象层次上分析与解决问题,然后再逐步地在较低抽象层次上予以落实。

从上述自动售货机的例子中能看到,使用抽象至少有如下好处:一是便于访问,外部对象只需知道有限的几个操作(作为接口)即可使用自动售货机对象;二是便于维护,如自动售货机的某部分有变化而其接口没有发生变化,只需在机器内部对该部分进行修改。甚至可用更优的具有相同接口的售货机对其进行替换,而不影响使用者的使用方式。

(2)分类

分类(classification)的作用是按照某种原则划分出事物的类别,以有助于认识复杂世界。

在oo中,分类就是把具有相同属性和相同操作的对象划分为一类,用类作为这些对象的抽象描述。如果一个对象是分类(类)的一个实例,它将符合该分类的模式。分类实际上是把抽象原则运用于对象描述时的一种表现形式。在oo中,进一步地还可以运用分类原则,通过不同程度的抽象,形成一般/特殊结构。

运用分类原则,清楚地表示了对象与类的关系,以及特殊类与一般类的关系。

(3)封装

封装(encapsulation)有两个含义:①把描述一个事物的性质和行为结合在一起,对外形成该事物的一个界限。面向对象方法中的封装就是用对象把属性和操纵这些属性的操作包装起来,形成一个独立的单元。封装原则使对象能够集中而完整地对应并描述具体的事物,体现了事物的相对独立性。②信息隐蔽,即外界不能直接存取对象的内部信息(属性)以及隐藏起来的内部操作,外界也不用知道对象对外操作的内部实现细节。在原则上,对象对外界仅定义其什么操作可被其他对象访问,而其他的对象不知道所要访问的对象的内部属性和隐藏起来的内部操作以及它是如何提供操作的。

通过封装,使得在对象的外部不能随意访问对象的内部数据和操作,而只允许通过由对象提供的外部可用的操作来访问其内部,这就降低了对象间的耦合度,还可以避免外部错误对它的“交叉感染”。另外,这样对象的内部修改对外部的影响变小,减少了修改引起的“波动效应”。图13所示的是封装的原理图,其中的一部分操作是外部可用的。

《面向对象分析与设计》一1.3面向对象的基本原则

严格的封装也会带来问题,如编程麻烦,有损执行效率。有些语言不强调严格的封装和信息隐蔽,而实行可见性控制,以此来解决问题。例如,c++和java就是这样的语言,通过定义对象的属性和操作的可见性,对外规定了其他对象对其属性和操作的可访问性;另外,一个对象也可以提供仅局限于特定对象的属性和操作,这可以通过把相应的可见性指定为受保护的或私有的来做到。

(4)消息通信

原则上,对象之间只能通过消息(message)进行通信,而不允许在对象之外直接地访问它内部的属性,这是由封装原则引起的。

消息必须直接发给特定的对象,消息中包含所请求服务的必要信息,且遵守所规定的通信规格说明。一条消息的规格说明至少包括:消息名、入口参数和可能的返回参数。一个对象可以是消息的发送者,也可以是消息的接收者,还可以作为消息中的参数。

(5)多态性

多态性(polymorphism)是指一般类和特殊类可以有相同格式的属性或操作,但这些属性或操作具有不同的含义,即具有不同的数据类型或表现出不同的行为。这样,针对同一个消息,不同的对象可对其进行响应,但所体现出来的行为是不同的。

(6)行为分析

关系机制提供了用关联、继承和聚合等组织类的方法。很多面向对象学者把系统模型的这部分结构称作静态模型,也有的称其为结构模型。通常,对系统还需要进行行为分析。

对于一个对象,由于其内的属性值在不断地发生着变化,按一定的规则根据属性值可把对象划分为不同的状态。在请求对象操作时,可能会使对象的状态发生改变,而对象的当前状态对随后的执行是有影响的。通过状态机图可以分析对象的状态变迁情况。

系统中的对象是相互协作的,通过发消息共同完成某项功能。这种协作的交互性可以用交互图来描述。

很多系统具有并发行为。从事物的并发行为的起因上看,事物的每个并发行为是主动发生的。体现在对象上,就是有一种对象是主动的,每个对象代表着一个进程或线程。在交互图上也能体现出对象间的并发行为。

(7)复杂性控制

为了控制系统模型的复杂性,引入了包(package)的概念。使用包可以把模型元素组织成不同粒度的系统单位,也可以根据需要用包来组织包。例如,用分析包和设计包来分别组织分析模型和设计模型,以显式地描述不同抽象层次的模型;对复杂类图也可以按类之间关系的紧密程度用包来组织类。

继续阅读