软件工程

来源:百度文库 编辑:神马文学网 时间:2024/04/27 16:14:59
对象
对象从不同的角度有不同的含义,我们针对系统开发来讨论对象的概念,其定义是:
对象(Object)是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组服务组成。
在这里,属性和服务是构成对象的两个基本要素,其定义是:
属性是用来描述对象静态特征的一个数据项。
服务是用来描述对象动态特征(行为)的一个操作序列。
',1)">
从一般意义上讲,对象是现实世界中的一个实际存在的事物,它可以是有形的,如车辆、房屋等,也可以是无形的,如国家、生产计划等。而人们在开发一个系统时,则在一定的范围(也称问题域)内考虑和认识与系统目标有关的事物,并用系统中的对象来抽象地表示它们。在这里,对象只描述客观事物本质的、与系统目标有关的特征,而不考虑那些非本质的、与系统目标无关的特征。同时,对象是属性和服务的结合体,对象的属性值只能由这个对象的服务来读取和修改。

类(Class)是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。
类好比是一个对象模板,用它可以产生多个对象。类所代表的是一个抽象的概念或事物,在客观世界中实际存在的是类的实例,即对象。
举例:在学校教学管理系统中,"学生"是一个类,其属性具有姓名、性别、年龄等,可以定义"入学注册"、"选课"等操作。一个具体的学生"王平"是一个对象,也是"学生"类的一个实例。
',2)">
把众多的事物归纳并划分成一些类是人类在认识客观世界时经常采用的思维方法,分类的原则是抽象,从那些与当前目标有关的本质特征中找出事物的共性,并将具有共同性质的事物划分成一类,得出一个抽象的概念。例如:人、房屋、树木等都是一些抽象的概念,它们是一些具有共同特征的事物的集合,称为类。类的概念使我们能对属于该类的全部个体事物进行统一的描述,"树具有树根、树干、树枝和树叶,它能进行光合作用",这个描述适合所有树,而不必对每一棵具体的树进行描述。
封装
封装(Encapsulation)是把对象的属性和服务结合成一个独立的系统单位,并尽可能隐藏对象的内部细节。
封装是面向对象方法的一个重要原则,系统中把对象看成是属性和对象的结合体,使对象能够集中而完整地描述一个具体事物。封装的信息隐蔽作用反映了事物的相对独立性,当我们从外部观察对象时,只需要了解对象所呈现的外部行为(即做什么),而不必关心它的内部细节(即怎么做)。
举例:电视机包括外形尺寸、分辨率、电压、电流等属性,具有打开、关闭、调谐频道、转换频道、设置图象等服务,封装意味着将这些属性和服务结合成一个不可分的整体,它对外有一个显示屏、插头和一些按钮等接口,用户通过这些接口使用电视机,而不关心其内部的实现细节。
',3)">
与封装密切相关的概念是可见性,它是指对象的属性和服务允许对象外部存取和引用的程度。
在软件上,封装要求对象以外的部分不能随意存取对象的内部数据(属性),从而有效地避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少了查错和排错的难度。另外,当对象内部需要修改时,由于它只通过少量的服务接口对外提供服务,便大大减少了内部修改对外部的影响,即减少了修改引起的"波动效应"。
封装也有副作用,如果强调严格的封装,则对象的任何属性都不允许外部直接存取,因此就要增加许多没有其他意义、只负责读或写的服务,从而为编程工作增加了负担,增加了运行开销。为了避免这一点,语言往往采取一种比较灵活的做法,即允许对象有不同程度的可见性。
继承
继承(Inheritance)是指子类可以自动拥有父类的全部属性和服务。
继承简化了人们对现实世界的认识和描述,在定义子类时不必重复定义那些已在父类中定义过的属性和服务,只要说明它是某个父类的子类,并定义自己特有的属性和服务即可。
举例:考虑轮船和客轮两个类,轮船具有吨位、时速、吃水线等属性和行驶、停泊等服务,客轮具有轮船的全部属性和服务,又有自己的特殊属性(如载客量)和服务(如供餐),因此客轮是轮船的子类,轮船是客轮的父类。
与父类/子类等价的其他术语有一般类/特殊类、超类/子类、基类/派生类等。
一个类可以是多个父类的子类,它从多个父类中继承了属性与服务,这称为多继承(Multiple Inheritance)。
举例:客轮既是一种轮船,又是一种客运工具,它可以继承轮船和客运工具这两个类的属性和服务。
',4)">
继承对于软件复用是十分有益的,如果将OO方法开发的类作为可复用构件,那么在开发新系统时可以直接复用这个类,还可以将其作为父类,通过继承而实现复用,从而大大扩展了复用的范围。
消息
消息(Message)是对象发出的服务请求,一般包含提供服务的对象标识、服务标识、输入信息和应答信息等信息。
通常,一个对象向另一个对象发出消息请求某项服务,接收消息的对象响应该消息,激发所要求的服务操作,并将操作结果返回给请求服务的对象。
举例:使用电视机时,用户通过按钮或遥控器发出转换频道的消息,电视机变换对电视台的接收信号频率,并将结果显示给用户。在这里,用户发出的信息包括:接受者--电视机;要求的服务--转换频道;输入信息--转换后的频道序号;应答信息--转换后频道的节目。
',5)">
面向对象技术的封装机制使对象各自独立,各司其职,消息通信则为它们提供了唯一合法的动态联系途径,使它们的行为能够相互配合,构成一个有机的运动的系统。
结构与连接
任何事物之间都不是互相孤立,而是彼此联系的,并因此构成一个有机的整体。对象之间常见的联系包括:
* 分类关系,即一般与特殊结构;
* 组成关系,即整体与部分结构;
* 对象属性之间的静态联系,即实例连接;
* 对象行为之间的动态联系,即消息连接。
(1) 一般与特殊结构

图4.1 一般与特殊结构
又称分类结构(classification structure),它是由一组具有一般与特殊关系(即继承关系)的类所组成的结构。其中,由一些单继承关系的类形成的结构称为层次结构,由一些多继承关系的类形成的结构称为网格结构,图4.1显示了一般与特殊的结构。
(2) 整体与部分结构
又称组装结构(composition structure),它描述对象之间的组成关系,即一个(或一些)对象是另一个对象的组成或部分。例如,大学中的系由办公室、实验室、资料室等组成, "办公室"、"实验室"、"资料室" 对象类与 "系" 对象类之间是部分与整体的关系。
(3) 实例连接
实例连接反映对象之间的静态联系,它是通过对象的属性来表现对象之间的依赖关系。在面向对象的术语中,对象之间的实例连接被称为链接(Link),而存在实例连接的对象类之间的联系称为"关联"(Association)。
例如,"教师"与"学生"是独立的两个类,它们之间存在"教学"联系,这种联系是通过类中的"教学课程"、"时间"、"地点"等属性建立起来的。
(4) 消息连接
消息连接描述了对象之间的动态联系,即如果一个对象在执行自己的服务时,需要通过消息请求另一个对象为它完成某个服务,那么就说第一个对象与第二个对象之间存在着消息连接。消息连接是有向的,从消息发送者指向消息接收者。
一般与特殊结构、整体与部分结构、实例连接和消息连接都是面向对象的分析和设计阶段必须考虑的重要概念,只有在分析和设计阶段认清问题域中的这些结构与连接关系,编程时才能准确而有效地反映问题域。
多态性
多态性(Polymorphism)是指在父类中定义的属性或服务被子类继承后,可以具有不同的数据类型或表现出不同的行为。
在体现一般与特殊关系的一个类层次结构中,不同层次的类可以共享一个操作,但却有各自不同的实现。当一个对象接收到一个请求时,它根据其所属的类,动态地选用在该类中定义的操作。
举例:在父类"几何图形"中定义了一个服务"绘图",但并不确定执行时绘制一个什么图形。子类"椭圆"和"多边形"都继承了几何图形类的绘图服务,但其功能却不相同:一个是画椭圆,一个是画多边形。当系统的其他部分请求绘制一个几何图形时,消息中的服务都是"绘图",但椭圆和多边形接收到该消息时却各自执行不同的绘图算法。
多态性机制不但为软件的结构设计提供了灵活性,减少了信息冗余,明显提高了软件的可复用性和可扩充性。多态性的实现需要OOPL提供相应的支持,与多态性实现有关的语言功能包括:重载(overload)、动态绑定(dynamic binding)、类属(generic)。
主动对象
主动对象(Active Object)是一组属性和一组服务的封装体,其中至少有一个服务不需要接收消息就能主动执行(称为主动服务)。
主动对象的作用是描述问题域中具有主动行为的事物以及在系统设计时识别的任务,其主动服务描述相应任务所应完成的操作。在系统实现阶段,主动服务应该被实现为一个能并发执行的、主动的程序单位,如进程或线程。
除了具有主动服务外,主动对象的其他方面与被动对象没有什么不同,主动对象中也可以有一些在消息的驱动下执行的一般任务。