第二章面向对象的分析与设计方法.docx
- 文档编号:8800053
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:67
- 大小:1MB
第二章面向对象的分析与设计方法.docx
《第二章面向对象的分析与设计方法.docx》由会员分享,可在线阅读,更多相关《第二章面向对象的分析与设计方法.docx(67页珍藏版)》请在冰点文库上搜索。
第二章面向对象的分析与设计方法
第二章面向对象的分析与设计方法
§1面向对象的分析与设计方法的产生和发展
§1.1现实世界中的对象
面向对象的分析与设计方法认为客观存在的、可被感知的、有独立性状的实体都是对象,如汽车、空气、数据库、操作系统等。
这种认识观点十分接近于哲学的唯物论观点。
而面向对象的分析与设计方法则强调从一个整体的观点上去分析事物。
§1.2面向对象(ObjectOriented)概念的起源
面向对象的概念首先是由挪威人Dahl和Nygaard于二十世纪60年代中期提出的,并在1967年推出simulation语言(至今仍有使用)编译器的开发中进行了实验。
当时的主要思路是期望能从一个现实的物理模型为基础直接转变为相应的软件模型。
§1.3面向对象理论体系的发展
限于当时的计算机开发条件,自从那次实验之后直到二十世纪80年代中期,面向对象的分析与设计方法的研究陷入了沉寂。
而随着二十世纪80年代中期以后计算机硬件的飞速进步和软件开发的更大规模拓展,对能够解决现存方法所带有的各种缺陷的新型软件开发方法的呼声日益高涨。
面向对象的分析与设计方法的研究再次被提出,到1991年竟出现了15种不同的理论方法。
有代表性的有:
·1989~1991,SallyShlaer和SteveMellor出了两本关于OO分析与设计的书;
·1987年,DavidHarel引入了状态图,用以描述系统或子系统有限状态的变化过程;
·1991~1995,PeterCoad和EdYourdon经过研究,开发出了较为简捷的面向原型的分析方法;
·1990年Smalltalk协会开发出了一种称为CRC(ClassResponsibilityCollaboration)卡的工具用于对象模型的分析过程;
·1991年JimRumbaugh小组对象的OMT(ObjectModelingTechnique)模型,后经GradyBooch作了进一步的完善(主要是符号体系和术语)成为目前公认的最实用化的OO模型;
·几乎在同一年,IvarJacobson(当时在为Ericsson服务)为OMT引入了UseCase的概念,成为了后来的UML的基础;
到目前为止,面向对象的分析与设计方法的新概念、新思路、新论点仍在不断的出现。
图2-1只是截止到1998年以前的面向对象的分析与设计方法模型理论发展的历程示意图。
由于面向对象的分析与设计方法目前还没有国际通用的建模套路,故本书内容所采用的是目前较为成熟的OMT(ObjectModelingTechnique)建模理论。
图1
-1面向对象的分析与设计方法模型理论发展的历程示意图
§1.3面向对象的分析与设计方法的优势
之所以会在计算机软件开发中掀起面向对象的分析与设计方法的研究和学用热潮是与面向对象的分析与设计方法相对于传统的面向过程的分析设计方法而存在的明显优势分不开的。
在传统的面向过程的分析设计方法中,处理数据的过程部分永远是被动地伴随数据流的变化而变化的。
常常是分析数据流的人员并不研发与之相关的处理过程。
这种从文档内就明显存在的二者的脱节给日后的维护工作带来了巨大的困难。
而面向对象的分析与设计方法在自始至终的环节上都将被处理的数据集合(即对象)及其处理过程紧密的联系在一起,从根本上避免了上述问题的发生。
另外,随着软件品种的日益丰富,软件开发商迫切的希望能够充分的利用已有的软件资源,避免对功能雷同或类似的软件部件进行重复开发,从而降低开发成本且提高开发速度。
面向对象的分析与设计方法正是适应了此种需要并提出了多种可操作的解决方案。
而传统的面向过程的分析设计方法已无法满足这种需要了。
在适应多任务环境、并行计算、安全防范等方面,面向对象的分析与设计方法更是有着传统的面向过程的分析设计方法无法比拟的优势。
§2面向对象的分析法(ObjectOrientedAnalysis)
§2.1对象(Object)概述
使人类赖以生存的客观物质世界都是由不同的对象所构成的。
将一个工业的阀门看作一个软件系统中的对象进行一些深入的分析可能有助于理解对象的概念。
一个正常工作的阀门应具有开启、关闭的状态,此时它还会处于内含的液(气)体的压力之下,具备一定的抗压强度。
当阀门处在开启状态后,液(气)体还有通过阀门时的流量、温度等对阀门有一定影响的形态的存在。
在外力的刺激作用下,阀门的开关可以发生移动而改变内部液气体的流量、压力、温度等直至打开或关闭阀门的状态。
如果此种移动定义为开移(即开阀门的移动)或关移(关阀门的移动)两个动作的话,对即非开又非关的移动便可定义为流量调节的移动。
因此一个阀门对象的以上特性可以归纳为下述两类:
·表现自身所处状态、位置、品质的数据描述;
·能够改变自身所处状态、位置、品质的所有的动作行为描述;
因此可以将表现自身所处状态、位置、品质等特性的数据描述集中在一起,而将与之相关联全部的动作行为也集中在一起并使其包围数据描述。
于是,据此可以绘制出如图2-1所示的阀门对象图。
在该图中以直线将不同的动作分割开来。
推而广之,客观世界中的所有对象都具有这两类特性。
并且对上述内容进一步抽象,将封装于内圆的那些表现对象内部各种所处状态、位置、品质的数据描述的总合称为属性(Attribute或知识);将外包的与属性相关联动作或操作行为的总合称为方法(Method),并将一个具有完整的属性和方法的客观实体称为一个对象(如图2-2)。
图2-2的图形通常又被简称为田田圈。
具此,前面讨论的阀门可用如图2-2所示的田田圈表示出来。
§2.2封装(Encapsulation)
由上所述,一个对象中的属性和方法具有极为紧密的联系。
每一个方法的行为目标就是田田圈内的部分或全部的属性数据。
每个属性成员数据的某个时刻的数值又是前一次方法实施的结果。
于是将一个具有完全的内置属性与外置方法的构成体就称为封装。
面向对象分析法中所讨论的对象都具有封装的特性。
图2-2所示的田田圈也正是一个对象封装的典型形态。
实际上将此概念推广至自然界中的对象,封装特性也是同样存在的。
封装具有下述的三个特点:
·封装将发生关联的所有属性与方法捆绑到一起,形成了具有明确边界的对象布局;
·属性内容的改变只受到对象内部方法的作用,与对象边界以外的任何因素的变化无直接关系。
·每个对象的方法都不能自主动作,而是由来自对象外的信号或者由来自本对象中另外方法的信号才能触发。
§2.3对象方法的引用—消息
每个对象外层的方法是外界可以看到并能直接引用的。
但引用一个对象的方法却要经过特定的访问形式才能实现。
这个访问形式便称为消息(Message)。
一个消息必须包含下述两项内容:
·接收消息的对象标识;
·所引用的该对象的方法标识;
一个消息可能包含下述另外两项内容:
·被访问的方法所需的参数;
·在引用完成后可能存在返回信息。
因此从上述意义上讲,一个消息的定义又可以叙述如下:
促使对象动作的来自外界的触发信息的总和被称为消息。
如果一个系统由两个以上的对象所构成的,则发出消息的一方被称为客户方(Client),而接收消息的一方被称为服务器方(Server)。
所以可以得出下述结论:
若要使得一个对象产生一个动作或改变某种状态,则必须有一个对象向其发出一个消息。
而消息可能返回的信息也必然应回传给消息的发出者。
因而这样又称一对消息的发/收方构成了一个客户—服务器结构模型(如图2-3所示)。
当然,客户方和服务器方并不是一成不变的。
在一个系统中通常会因运行条件的不同而相互转变它们之间的角色位置。
例1:
试将下述C语言语句按对象消息结构予以说明:
“doubled=0;d+=2.5;”。
解:
若视d为一个对象,则“=”和“+=”将是对象d方法中的一员。
两式中的数值0和2.5应视为消息所使用的参数(如图2-4所示)。
实际上,题中两个消息的发出者分别是编译器和一个临时存在的对象d’。
例2:
设a=,b=,c=a+b,试绘其相应的消息传递图。
解:
依据上题的分析思路便可获得如图2-5所示的消息流程图。
§2对象数据类型的抽象与类
如同传统的面向过程分析与设计方法研究问题一样,在面向对象的分析与设计方法中研究的对象应尽量避免使用过于个性化的单个对象作为样本,通常是采用在对分散的、孤立的对象进行抽象之后的而获得的具有同类对象共性的抽象化的对象类进行。
§2.1对象的抽象—类
在面向对象的分析与设计方法中将被抽象化的对象称做类(Class)。
这与C语言中的用户自定义数据类型struct结构的情景十分相似。
类就如同一个对象的模具,可以制造出一个个装有具体属性数值的对象来。
如一个学生对象应有描述学生学号、姓名等属性数据成员;还应有对这些属性数据成员进行输入/输出操作的相应方法。
于是可将它们绘制成如图2-6所示的对象生成流图。
在现实世界中的对象内的属性和方法可以按数学模型设立访问权限,这些访问权限是通过具体的语言所提供的相应的语法予以支持。
由此可得出类的如下特点:
·
一个类是同一类对象的抽象存在形式,包含全部的属性数据结构及其相应方法的描述但不包含具体的属性数值;
·用一个类可以生成多个含具体属性数值的同类的对象;
·类的属性成员的值将随对象的不同而不同,而所有的同类对象却只引用一套方法。
§2.2OMT系统的符号定义
为了能够明确地将具体的对象与其抽象形式—类相区别,OMT确定用下述两种符号分别代表对象和类:
两者之间的主要差别在属性描述上,类中的属性结构描述只要声明属性的类型、长度的等定性结构。
而对象中属性值描述则必须给以确定的数值(如图2-7所示)。
当要对类的所有成份进行精细描述时可使用如图2-8所示的图符来表述。
例2:
一个学生类及其对象的描述如图2-9所示
§2.4应用OMT构建对象模型的基本内容和步骤
OMT构建对象模型的步骤是围绕以下三项基本内容展开的:
对象模型(ObjectModel)、动态模型(DynamicModel)和功能模型(FunctionModel)。
一.对象模型所要解决的问题
·系统中对象的提取与类标注;
·系统中对象间的关系;
·对象类中的属性结构和方法的描述;
二.动态模型所要解决的问题
·描述系统的控制机制;
·描述系统的工作形态的变化形式;
三.功能模型所要解决的问题
·描述系统内各对象的数据流入/流出形态;
·描述系统内各对象的数据流入/流出的相应处理过程;
OMT作为一种经典的面向对象的分析与设计方法,不仅仅是上述的三个分析与设计步骤,而且还提出的一整套与上述步骤相配套的文档描述格式、图形符号和对象演化技术。
这些内容将在后续章节中陆续讨论到。
§2.5类间的相互关系
不同类的对象必然要产生相互的关系。
这种关系概括起来可分为三类:
包容(Aggregration)关系、继承(Inheritance)关系和关联(Association)关系。
一.包容关系
⒈描述
现实当中,一个对象往往可以由一个以上的其他对象所构成。
如一个学校由若干学生、课程和教师所构成;而课程可以由数学、外语等不同内容的具体课程所构成(如图2-10示意图所示)。
但倘若学校缺了其中一部分,则学校的性质就发生了变化。
因此,在一个类中若存在至少有一个属性成员不是简单的数据类型而是另外一个类的关系就被称为包容关系(如图2-11所示)。
这些内容
学校
学生课程教师
数学……外语
图2-10学校的包容关系示意
都不是用简单的数据类型能够代替的。
类的包容关系有下述特点:
·包容类含有一个以上的不同于自身特性的类对象,舍此而无法存在;
·被包容的类作为包容类的一个必须的组成部分而存在于包容类之中;即具有自身的原有性质,也不受包容类中其它被包容的类对象的影响;
·作为包容类的一个成员,被包容类对象可能出现的数目是不确定的,只能在其生成时被随机的插入。
⒉符号体系
图2-12OMT描述包容关系的图例
OMT用来描述包容关系的结构图如图2-12所示。
图中的包容类用一个菱形与被包容类相连接。
在连线的终端处的圆表示包容的数量关系。
OMT允许的表示包容的数量关系的符号体系如图2-13所示。
为了读者进一步学习UML的方便,还在其右侧列出了相应的UML的对应符号。
图2-13OMT描述包容关系的数量符号
⒊两类包容关系
由于包容关系必然涉及到两个以上的类对象,故而包容类对象与被包容类对象在系统中出现的状况便是令人关注了。
由此也出现了两类包容关系。
①嵌入包容(Embedaggregation)
若被包容类对象系在包容类对象出现之前已独立存在于系统内,仅当包容类对象生成后才被插入,则称此种包容关系为嵌入包容关系。
嵌入包容关系中的包容类对象和被包容类对象的相互依存关系较为松散,实际存在一个双方同时都独立活化在系统内部的暂时状态(当然此时包容类对象的功能不能展开)。
在OMT用来描述包容关系的结构图中用一个空心的菱形表示此种包容关系。
图2-14复合包容关系示例
例3:
嵌入包容关系示例如图2-14所示
②复合包容(Compositeaggregation—Composition)
若被包容类对象系在包容类对象生成的同时被连带生成的,则称此种包容关系为复合包容关系。
复合包容关系中的包容类对象和被包容类对象的相互依存关系非常紧密,若被包容类对象一旦在系统内消失则包容类对象便随之消亡。
在OMT用来描述包容关系的结构图中用一个实心的菱形表示此种包容关系。
例4:
复合包容关系示例如图2-15所示
图2-15复合包容关系示例
例5:
若有一个被称为堆栈的类,试指出其对象间的关系和必须具备的方法。
解:
堆栈对象是以集合方式存在的,故堆栈对象应是一个包容器,用于存放所有的堆栈数据。
所以该关系应为包容关系。
堆栈类应至少具备以下的方法:
·加入一个元素;
·弹出一个元素;
·检测堆栈是空的;
·检测堆栈已满;
二.继承关系
⒈描述
一个对象拥有另一个对象的部分或全部的属性及其相应的方法的关系则称为继承关系。
继承关系不仅是一种静态的结构形式,而且还是一种动态的过程。
若两个以上的类中含有共同的属性和方法,可将其提取而构成一个新的类。
这个被提取出的类便与提取类就构成了继承关系。
相对于被提取类而言,提取类是被提取类的派生类(SubClass);相对于提取类而言,被提取类是提取类的基类(Supclass)。
如人们将地球上的生物圈划分成如图2-16所示的继承结构示意图。
动物类则是生物类的派生类,但却又是哺乳类的基类。
继承关系存在下述特点:
·若一个派生类只是继承了基类的部分成份称为限制性(Restriction)继承;
·若一个派生类不仅继承了基类的全部成份而且还增加了基类中所没有的成份则称为拓展性(Extension)继承;
·当一个派生类拥有两个以上的基类时,又被称为多重派生(Multipleinheritance);
·在定性讨论中也可以用直线连接基类和派生类(如图2-16所示);
·重写又称为覆盖(Overriding)是指在派生类中对继承来的成份进行的完善性重写。
重写是面向对象技术中为实现重用的一个重要的技术手段;
生物
微生物动物植物
哺乳类爬行类
食肉食草
虎……狮牛……羊
图2-16生物继承结构示意
·派生类对象中的基类对象不一定是完整的;
·存在于派生类对象中的基类对象是以分割形式出现的(如图2-17所示);
·派生类对象具有基类对象的许多相似成分(akindof);
·继承关系与包容关系又常被统称做综合关系(Generalization);
⒉符号体系
OMT用来描述继承关系的结构图如图2-18所示。
图中的派生类用一个三角型与基类相连接。
图2-18OMT描述继承关系的图例
例4:
试确定下述结构的对象关系。
文件
数据库文件文本文件
解:
由于文本文件和数据库文件都具有上一支文件的所有属性与方法,故该结构关系应为继承关系。
该图中前两支文件应具有属性和方法如图2-19所示。
图2-19例4对象的属性与方法
三.关联关系
⒈描述
存在有消息关系的对象关系称为关联关系。
关联关系是现实世界中的对象间普遍存在的相互作用关系。
在一般情况下关联关系不能从对象内的属性成份直接获得。
目前还很少有对象化的高级语言直接支持关联关系的描述。
与关联关系有关的附加成份非常多,并可以由多种关联关系的符号来表述。
在对象模型中使用直线将两个对象模型相连即可最简单地描绘关联关系。
例5:
关联关系的实例
⒉关联关系的附加成份与相应的符号体系
①连接(Link)
体现在具体对象间的关联关系称为连接。
这种差别仅体现在类和对象符号的使用上(如图2-20所示)。
图2-20关联关系与连接
②多元关联关系的描述
两个类间存在关联关系称为二元(Binary)关联关系,是关联关系中最普遍存在的一类。
若有三个以上的类存在关联关系则被称为多元(n-ary)关联关系,此时用一个菱形符号将类连接在一起(如图2-21所示)表述。
图2-20多元关联关系的符号体系与实例
③关联关系中的对象数量的表述(Multiplicity)
上述关联关系的符号(即直线)所表现的是一个类对象与另一个类对象间的数量关系。
若在某个时刻参与这种关系的类对象不止一个时,就有必要指出其相应对象的数量。
关联关系中的对象数量的描述符号与前述的包容关系完全一致。
有所不同的是在连线的两端都可能出现“多”的描述。
例6:
图2-21关联关系中对象数量的体现
④连接属性
图2-22连接属性的图形描述符号
将同时出现在具有关联关系的类内的同一属性称为连接属性,其图形描述符号如图2-22所示。
连接属性在某些条件下甚至可以成为另一个类。
这里的条件大致有两项:
·连接属性所在的关联关系是另一个关联关系的一部分;
·存在其它类对象对连接属性有操作;
例7:
图2-23连接属性转为类
⑤作用名(RoleName)
与一个关联关系相关的两个类对象在使用该关联后所发挥的作用常常不能从类名本身很直观的体现出来。
为此,可在一个关联关系的两侧标注确切的作用名称。
例8:
图2-24作用名的表示
⑥有序化(Ordering)
一般地认为由关联关系所联系的“多”对象一侧的对象内是一个无序化的对象集合。
若需要这些对象按一定顺序发出关联关系的动作,则称为关联有序化或强制有序化。
此时将表示顺序的属性名置于{}内放在“多”对象的一侧关联线的上方。
例9:
表现对象有序化的实例如图2-25所示:
⑦限定性(Qualification)关联关系
图2-25有序化的实例
限定性关联关系是发生在二元的一对多关联关系当中的一类特殊的关联关系。
为了能够唯一的识别出关联关系所涉及的多个终点中的某一个点,在“一”方类中必然存在用于识别所需终点标识的属性结构。
此时便称之为限定性关联关系。
用于识别所需终点的属性名又称为限定名。
例10:
表现对限定性关联关系的实例如图2-26所示:
图2-26限定性关联关系的实例
⑧候选键(Candidatekeys)
将能够唯一标识一组关联关系的最小的(分别处于双方的)属性集合称为候选键。
(一)二元关联关系
(二)多元关联关系
依据前述的多对多的分析结论,在多元关联关系中可能存在由多个类中的属性组成的的候选键。
但具体选择要视关联的紧密程度而定。
例11:
依据下表排列的美国NBA联赛安排表确定候选键
PlayerTeamYear
JohmsonL.A.Lakers1989
BarkleyPhiladelphia1992
BarkleyPhoenix1992
JohmsonL.A.Lakers1993
JordanChicago1997
由上表分析得出:
一个球员参加联赛的制约要素至少为表内所列各项。
所以候选键可选定如图2-27所示。
图2-27NBA联赛的候选键
§3关于类的一些进一步的问题
上述内容针对工程实践中的具体问题阐述了关于类和对象及其相互关系的基本概念。
本节将进一步从理论上的更深层次讨论有关类的一些深入概念。
§3.11抽象类(Abstractclass)
从两个以上的类中提取共同的属性和方法而形成基类的过程称为类的抽象。
若抽象过程不断进行而获得的某层基类便可能(如人类的基类—哺乳类)。
此种失去定义对象的能力的类的共同特点便是含有无法定量描述的属性,因而也只能给出相应模糊的方法(如动物类应含有一个“当前位置”的属性,并有一个相对应的“移动”的方法)。
这时便将此种只有描述而不能再定义对象的类称为抽象类。
在面向对象的分析与设计方法中使用抽象类构建系统的整体模型将会使人们感到系统结构的清晰易董。
使用抽象类的优点是:
·模型简单易读,系统伸缩性好;
·为“重用”做技术准备;
·多态技术(Polymorphism)的一种技术实现
因此,面向对象的分析与设计总是从系统抽象的顶层开始的。
§3.2类属性与类方法
在上述讨论中,消息是在对象间传递的。
而在某些特殊场合,希望一个消息的接收者不是对象,而是一个类自身。
如要统计一个类目前已生成了多少个对象这样的工作,似乎交给这个类的哪个对象都不恰当,最好由类自身来完成。
这时就需要这个类具有属于类(而不属于任何一个该类对象)的属性及其方法了。
应用类属性和类方法通常用来满足下述应用目的:
·控制新对象的生成;
·查询已有的对象情况;
·报告类的结构状况;
类属性和类方法在不同的面向对象的程序设计语言中都是用专门的语句来实现的。
但由于外界可以通过向类发消息而引用类方法,从而导致轻易改变类属性的数值,因而其安全性能不好、使用并不广泛。
§3.3元数据(Metadata)与元模型(Metamodels)概念和类的关系
元数据与元模型是数据结构分析中使用的概念,而面向对象分析中的类与对象的概念与元数据、元模型等概念存在着紧密的联系。
一.元数据
描述其它数据的数据称为元数据。
如“姓名”是“张三”、“李四”等具体名子的元数据。
类是其对象实例的元数据。
二.模式(Patterns)与同类性(Instantiation)
模式是描述含有确定格式的实例的元数据群。
而由此引发的实例样本与模式之间的关系就称为同类性。
上述命题可用图2-28所示的实例描述:
图2-28模式与同类性的实例
模式与同类性在OO分析中使用时有两种情形:
⒈模式就是类
图2-29模式就是类
例12:
⒉模式和实例样本都是类
例13:
抽象类动物类和人类可构成同类性关系(如图2-30所示)
图2-30模式和实例样本都是类的举例
要指出的是,具有同类性关系的类间并不一定都具有继承关系,但的确可以用继承关系来实现具有同类性关系的类的设计。
三.元模型
元模型是具有元素的格式、句法和语义描述的元数据群。
§3.4对象模型中的问题与求解间的关系
大多数情况下对象模型中的对象并不一定能最终成为系统实现中的对象。
或者反言之,解题空间中的对象在对象模型中并不存在而是在最后的设计阶段被创造出来的(如图2-31所示)。
造成此种结局的原因可以有下述之一:
·一些无法实现的物理对象只能用软件的模拟来代替;
·一些物理的事件需要解题空间保持一些它所需要的信息才能出现;
·对象之间的交互也需要解题空间内的特定对象的存在才能实现;
·
图2-31对象模型中分析与设计之间的关系
一对多和多对多的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二章 面向对象的分析与设计方法 第二 面向 对象 分析 设计 方法