《面向对象方法学》PPT课件.ppt_第1页
《面向对象方法学》PPT课件.ppt_第2页
《面向对象方法学》PPT课件.ppt_第3页
《面向对象方法学》PPT课件.ppt_第4页
《面向对象方法学》PPT课件.ppt_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

上次课内容回顾,第8章 维护 8.1 软件维护的定义 8.2 软件维护的特点 8.3 软件维护过程 8.4 软件的可维护性 8.5 预防性维护 8.6 软件再工程过程,上次课内容回顾,class PCI8360v public: PCI8360v(void); virtual PCI8360v(void); void PCI_init(); void PCI_clos(); short PCI_read(); ;,class ArPathTrack : public ArAction public: ArPathTrack(ArPose Pose); virtual ArPathTrack (void) ; virtual ArActionDesired *fire(ArActionDesired currentDesired); virtual void setRobot(ArRobot *robot); protected: ArRangeDevice *mySonar; ArActionDesired myDesired; public: PCI8360v myPCI; ;,第9章 面向对象方法学引论,9.1 面向对象方法学概述 9.2 面向对象的概念 9.3 面向对象建模 9.4 对象模型,前言:关于传统方法学的总结,传统的生命周期方法学的本质,是在具体的软件开发工作开始之前,通过需求分析预先定义软件需求,然后一个阶段接着一个阶段有条不紊地开发用户所要求的软件,实现预先定义的软件需求。 但它并不能完全消除软件危机。生命周期方法学仍然有许多不足之处,对某些类型的软件开发,这种方法学比较适用,对另一些类型的软件则可能完全不适用。,前言:传统方法学存在的问题,1生产率提高的幅度远不能满足需要 生命周期方法学强调需求分析的重要性,强调在每个阶段结束之前必须进行评审,从而提高了软件开发的成功率,减少了重大返工的次数; 开发过程中实行严格的质量管理,采用先进的技术方法(主要是结构分析、设计、编程技术)和软件工具,也都加快了软件开发的速度。 但开发效率的提高仍然很有限,提高的幅度远远赶不上对软件产品的需要。从用户提出要求到他们最终得到所需要的目标系统,往往需要经过几年甚至更长的延迟时间。,2软件重用程度很低 重用也称为再用或复用,是指同一事物不经修改或稍加改动就多次重复使用。软件重用是节约人力,提高软件生产率的重要途径。 结构分析、结构设计和结构程序设计(简写为 SASDSP)技术,虽然给软件产业带来了巨大进步,但却没能很好地解决软件重用问题。 几乎每次开发一个新的软件系统时,都要针对这个具体的系统作大量重复而又繁琐的工作。,前言:传统方法学存在的问题,3.软件仍然很难维护 传统的生命周期方法学强调文档资料的重要性,规定最终的软件产品应该由完整、致的配置成分组成;在软件开发整个过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要质量指标。因此,对这样的软件所进行的维护属于结构化维护的范畴,可维护性有比较明显的提高,软件从不能维护变成基本上可以维护。 但实践表明,即使是用生命周期方法学开发出的软件,维护起来仍然相当困难,软件维护成本仍然很高。,前言:传统方法学存在的问题,4软件往往不能真正满足用户需要 用传统方法开发涉及多种不同领域知识的大型软件系统,或开发需求模糊或需求动态变化的系统时,所开发出的软件系统往往不能真正满足用户的需要。 所谓“不能真正满足用户的需要”,主要有以下两种表现: 一种是开发人员不能完全获得或不能彻底理解用户的需求,以致开发出的软件系统与用户预期的系统不一致,不能满足用户的需要。 另一种表现是,所开发出的系统不能适应用户需求经常变化的情况,系统的稳定性和可扩充性不能满足要求。,前言:传统方法学存在的问题,前言:出现问题的原因,1僵化的设计模型 瀑布模型意味着在生命周期各阶段间存在着严格的顺序性和依赖性。 生命周期方法学特别强调预先定义需求的重要性。要求在着手进行具体的开发工作之前,必须通过需求分析预先定义并“冻结”软件需求,然后再一步一步地实现这些需求。 实践表明,在系统建立起来之前,往往很难仅仅依靠分析就确定出一套完整、准确、一致、有效的应用需求,这种预先定义需求的方法更不能适应用户需求不断变化的情况。,前言:出现问题的原因,2.结构化技术的缺点 用这种技术开发出的软件,其稳定性、可修改性和可重用性都比较差。 围绕实现处理功能的“过程”来构造系统的。然而用户需求的变化大部分是针对功能的不稳定性 清楚地定义了目标系统的边界,软件通过界面与客观世界通信。系统结构依赖于对系统边界的定义,很难把这样的系统扩展到新的边界系统较难修改和扩充 把处理分解成子处理的过程多少带些任意性,并且把数据和操作作为分离的实体可重用性差,面向对象方法的四个要点:,(1)面向对象方法用对象分解取代了传统方法的功能分解。 面向对象的软件系统是由对象组成的,软件中的任何元素都是对象,复杂的软件对象由比较简单的对象组合而成。 (2) 把所有对象都划分成各种对象类(简称为类,class),每个对象类都定义了一组数据和一组方法(method)。数据用于表示对象的静态属性(attribute),是对象的状态信息。方法,是允许施加于该类对象上的操作,是该类所有对象共享的。,(3) 按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。在这种层次结构中,通常下层的派生类具有和上层的基类相同的特性(包括数据和方法),这种现象称为继承(inheritance)。 低层的特性将屏蔽高层的同名特性(override)。如果在派生类中对某些特性又做了重新描述,则在派生类中的这些特性将以新描述为准。 (4) 对象彼此之间仅能通过传递消息互相联系。对象是进行处理的主体,必须发消息请求它执行它的某个操作,处理它的私有数据,而不能从外界直接对它的私有数据进行操作。又称为“封装性” (encapsulation),面向对象的方法学可以用下列方程来概括: OO=objects+classes+inheritance+communication with messages 也就是说,面向对象就是既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信。,9.1.2 面向对象方法学的优点,1.与人类习惯的思维方法一致 面向对象的软件技术以对象(object)为核心,用这种技术开发出的软件系统由对象组成。对象是对现实世界实体的正确抽象,它是由描述内部状态表示静态属性的数据,以及可以对这些数据施加的操作(表示对象的动态行为),封装在一起所构成的统一体。对象之间通过传递消息互相联系,以模拟现实世界中不同事物彼此之间的联系。,9.1.2 面向对象方法学的优点,2. 稳定性好 由于现实世界中的实体是相对稳定的,因此,以对象为中心构造的软件系统也是比较稳定的。 3. 可重用性好 有两种方法可以重复使用一个对象类:一种方法是创建该类的实例,从而直接使用它;另一种方法是从它派生出一个满足当前需要的新类。 4. 较易开发大型软件产品,9.1.2 面向对象方法学的优点,5. 可维护性好 (1) 面向对象的软件稳定性比较好。 (2) 面向对象的软件比较容易修改。 (3) 面向对象的软件比较容易理解。 (4) 易于测试和调试。,图9.1 喷泉模型,“喷泉”这个词体现了面向对象软件开发过程迭代和无缝的特性。图中代表不同阶段的圆圈相互重叠,这明确表示两个活动之间存在交迭;而面向对象方法在概念和表示方法上的一致性,保证了在各项开发活动之间的无缝过渡. 事实上,用面向对象方法开发软件时,在分析、设计和编码等项开发活动之间并不存在明显的边界。图中在一个阶段内的向下箭头代表该阶段内的迭代(或求精)。图中较小的圆圈代表维护,圆圈较小象征着采用了面向对象范型之后维护时间缩短了。,9.1.3 喷泉模型,9.2 面向对象的概念,9.2.1 对象 概念:对象是由描述该对象属性的数据以及可以对这些数据施加的所有操作封装在一起构成的统一体。 对象可以作的操作表示它的动态行为,通常把对象的操作称为服务或方法(Method)。,对象的定义 (1) 定义1: 对象是具有相同状态的一组操作的集合。 (2) 定义2: 对象是对问题域中某个东西的抽象,这种抽象反映了系统保存有关这个东西的信息或与它交互的能力。也就是说,对象是对属性值和操作的封装。 (3) 定义3: 对象=ID,MS,DS,MI。其中,ID是对象的标识或名字,MS是对象中的操作集合,DS是对象的数据结构,MI是对象受理的消息名集合(即对外接口)。,对象的特点 (1) 以数据为中心。 (2) 对象是主动的。它是进行处理的主体。 (3) 实现了数据封装。 它的私有数据完全被封装在盒子内部,对外是隐藏的、不可见的,对私有数据的访问或处理只能通过公有的操作进行。 (4) 本质上具有并行性。 不同的对象能够独立的处理自身的数据,彼此通过发消息传递信息完成通信。 (5) 模块独立性好。 对象是面向对象的软件的基本模块。模块的内聚性强,耦合性弱。,9.2.2 其他概念,类(class) “类”是对具有相同数据和相同操作的一组相似对象的定义, 类是对具有相同属性和行为的一个或多个对象的描述。 例:类(class):圆(circle) circle:myCircle 2. 实例(instance) 实例就是由某个特定的类所描述的一个具体的对象, 实际上类是建立对象时使用的“样板” 。 “对象”,既可以指一个具体的对象,可以泛指一般的对象, “实例”,是指一个具体的对象。 例:实例(对象object):几个不同大小、位置的圆。,3. 消息(message) 消息就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。通常,一个消息由下述3部分组成: . 接收消息的对象; . 消息选择符(也称为消息名); . 零个或多个变元。 例: myCircle.show(Red),4. 方法(method) 方法就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,响应消息的方法。在C+语言中把方法称为成员函数。 方法(Method):画圆、擦除圆、填充圆,显示圆。 5. 属性(attribute) 属性就是类中所定义的数据,它是对客观世界实体所具有的性质的抽象。类的每个实例都有自己特有的属性值。在C+语言中把属性称为数据成员. 属性(Attribute):圆心坐标、圆的半径、圆的颜色,线形等。,【例题】C中类、属性和方法的示例 Class Example1 static public int a; /属性,静态数据成员,属于类所有 pulic int b; /非静态数据成员,属于实例所有 void Meth1() /实例方法 a=10;b=20; static void Meth2() /静态实例方法 a=30;/b=40; public static void ExDemo() Example E1=new Example1(); /实例E1 Example E2=new Example1(); E1.Meth1(); /E1.Meth2(); Example1.a=Example1.a+50; E2.b=Example1.a+60; ,6. 封装(encapsulation) 封装也就是信息隐藏,通过封装对外界隐藏了对象的实现细节。使用一个对象的时候,只需知道它向外界提供的接口形式,无须知道它的数据结构细节和实现操作的算法。 对象具有封装性的条件如下: (1) 有一个清晰的边界。所有私有数据和实现操作的代码都被封装在这个边界内,从外面看不见更不能直接访问。 (2) 有确定的接口(即协议)。这些接口就是对象可以接受的消息,只能通过向对象发送消息来使用它。 (3) 受保护的内部实现。实现对象功能的细节(私有数据和代码)不能在定义该对象的类的范围外访问。,7. 继承(inheritance) 在面向对象的软件技术中,继承是子类自动地共享基类中定义的数据和方法的机制。 面向对象软件技术中把类组成一个层次结构的系统(类等级):一个类的上层可以有父类,下层可以有子类。这种层次结构系统的一个重要性质是继承性,一个类直接继承其父类的全部描述(数据和操作)。 继承具有传递性。因此,一个类实际上继承了它所在的类等级中在它上层的全部基类的所有描述,也就是说,属于某类的对象除了具有该类所描述的性质外,还具有类等级中该类上层全部基类描述的一切性质。,【例题】C中继承的示例 using System; class Pen public string Color; public static double Price; private int Length; protected int Width; public void SetWidth (int w) Width=w; public int GetWidth() return Width; public void write() Console.WriteLine(“现在用笔在写字!“); class Pencil:Pen new public void write()/与基类同名的方法,将覆盖继承来的基类同名方法 Console.WriteLine(“现在在用铅笔写字!“); public void Erase()/在派生类中定义的方法 Console.WriteLine(“现在擦除已有的文字!“); ,class Test public static void Main() Pencil P1=new Pencil();/产生一个铅笔对象P1 P1.Color=“Black“; Pencil.Price=6; /P1.Length=20;/错误,private成员只能在本类中访问 /P1.Width=1;/错误,protected成员只能在类或其派生类中访问 P1.SetWidth(20); P1.write(); P1.Erase(); Console.Write(“笔的颜色为:0,价格为:1,宽度为:2“,P1.Color,Pencil.Price,P1.GetWidth(); ,8. 多态性(polymorphism) 多态性是指子类对象可以像父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。 C+中,多态性是通过虚函数实现的。同一操作作用于不同类的实例。 9. 重载(overloading) 1)函数重载是指在同一作用域内的若干个参数特征不同的函数可以使用相同的函数名字; 2)运算符重载是指同一个运算符可以施加于不同类型的操作数上面。,【例题】C中多态性的示例 class BaseClass /基类 public void NVMeth()/定义基类的非虚方法 Console.WriteLine(“调用了基类BaseClass类的非虚方法NVMeth“); public virtual void VMeth()/定义基类的虚方法 Console.WriteLine(“调用了基类BaseClass类的虚方法NMeth“); class InClass:BaseClass /定义派生类 new public void NVMeth()/定义派生类的非虚方法,用new关闭警告 Console.WriteLine(“调用了派生类InClass类的非虚方法NVMeth“); public override void VMeth()/定义派生类的虚方法,使用override进行重载 Console.WriteLine(“调用了派生类InClass类的虚方法NMeth“); ,class Test public static void Main() InClass InObj=new InClass();/生成派生类对象InObj BaseClass BaseObj=InObj;/把派生类InObj的对象赋值给基类的对象BaseObj BaseObj.NVMeth();/调用BaseObj对象的非虚方法 BaseObj.VMeth();/调用BaseObj对象的非虚方法 InObj.NVMeth();/调用InObj对象的非虚方法 InObj.VMeth();/调用InObj对象的非虚方法 ,方法重载,using System; class OverTest public double area(double r)/求圆的面积,只有一个参数 return(Math.PI*r*r); public double area(double a,double b)/求矩形面积,有两个参数 return(a*b); public double area(double a,double b,double c)/求三角形面积,有三个参数 double l,s; l=(a+b+c)/2; s=Math.Sqrt(l*(l-a)*(l-b)*(l-c); return(s); ,class Exam public static void Main() OverTest shape=new OverTest();/定义类的实例 /求圆的面积 Console.WriteLine(“R is 0,Area is 1“,3.0,shape.area(3.0); /求矩形的面积 Console.WriteLine(“A is 0,B is 1,Area is 2“,3.0,4.0,shape.area(3.0,4.0); /求三角形的面积 Console.WriteLine(“A is 0,B is 1,C is 2,Area is 3“,3.0,4.0,5.0,shape.area(3.0,4.0,5.0); ,运算符重载,【例1】MATLAB中”*”运算符,支持向量、矩阵、实数和复数的“乘”运算。 【例2】C中,运算符重载在类中进行声明。 格式: 返回值类型 operator 运算符(运算对象列表) 重载的实现部分;,class Complex/复数类 double a,b;/代表实部与虚部,私有变量 public Complex(int m,int n)/构造函数 a=m; b=n; /重载“+”运算符使之能够对两个复数进行加 public static Complex operator +(Complex x,Complex y) Complex t=new Complex(0,0); t.a=x.a+y.a; t.b=x.b+y.b; return(t); Complex x=new Complex(1,2);/生成第一个复数 Complex y=new Complex(3,4);/生成第二个复数 Complex z=new Complex(0,0);/生成第三个复数 z=x+y;/通过重载运算符“+”求得复数x、y的和并赋值给z,习题: 用面向对象方法解决下述问题时需要哪些对象类?类与类之间有何关系? 在显示器屏幕上圆心坐标为(250,100)的位置,画一个半径为25的小圆,圆内显示字符串“you”;在圆心坐标为(250,150)的位置,画一个半径为100的中圆,圆内显示字符串“world;再在圆心坐标为(250,250)的位置,画一个半径为225的大圆,圆内显示字符串“Universe”。,答:解决这个问题的一个可能的方案是,在“圆”类中增加一个字符串类型的属性,并给“圆”类的服务“显示”加一段代码,使它不仅能在屏幕上显示圆,而且能在圆内显示字符串。虽然用面向对象的程序设计语言实现这个方案并不困难,但它却不是一个理想的方案:字符串和圆是截然不同的两类实体,当我们考虑字符串时,想到的是字符串内容、字体、字号(字符大小)、对齐方式及其他一些可能的属性,它们中没有哪一个是与圆有关的。把两类不同实体的属性放在同一个类中,这样定义出的“综合”模块的独立性显然比较差。 当处理性质完全不同的功能时,更理想的方案是,首先建立一些“基础性”的基类,然后把若干个基础性基类的适当特征组合起来,利用多重继承机制派生出一个特定的派生类,使这个派生类具有所需要的综合功能。,在解答上一题时已经定义了圆类,它定义了圆的属性,并能提供在屏幕上显示圆的服务,可以认为圆类是关于图形圆的一个基础性的类。 现在还需要再定义一个关于字符串的基础性的类,这个类的基本功能是,在图形模式下从指定的坐标开始,在屏幕上以指定的字体显示一个给定内容的字符串,字符的大小由字符串在屏幕上占用的长度决定。 分析上述需求可知,“图形模式字符串”类的基本属性如下:位置(即坐标),字符串内容,显示字符串时的字体,显示字符串时占用的屏幕长度。在解答上一题时曾经定义了位置类,图形模式字符串的基本属性中又包含位置属性,显然应该从位置类派生出图形模式字符串类。该类对外提供的服务为,在屏幕的指定位置以指定字体显示给定的字符串。,有了“圆”和“图形模式字符串”这样两个基础性的类之后,就可以利用多重继承机制从这两个类派生出一个新类,我们给这个派生类起名字为“圆内字符串”,它既继承了圆类在屏幕上显示圆的功能,又继承了图形模式字符串类在图形模式下显示字符串的功能,从而具有在屏幕上显示圆且在圆内显示字符串的综合功能。 综上所述,解决本问题所用到的对象类及类之间的层次关系如下: 从“位置”类分别派生出“点”类和“图形模式字符串”类,然后由“点”类派生出“圆”类,最后由“圆”类和“图形模式字符串”类共同派生出“圆内字符串”类。,MI 与钻石问题!,关于多重继承,#include using namespace std; class Vehicle public: Vehicle(int weight = 0) Vehicle:weight = weight; cout“载入Vehicle类构造函数“endl; void SetWeight(int weight) cout“重新设置重量“endl; Vehicle:weight = weight; virtual void ShowMe() = 0; protected: int weight; ;,class Car:virtual public Vehicle/汽车,这里是虚拟继承 public: Car(int weight=0,int aird=0):Vehicle(weight) Car:aird = aird; cout“载入Car类构造函数“endl; void ShowMe() cout“我是汽车!“endl; protected: int aird; ;,class Boat:virtual public Vehicle/船,这里是虚拟继承 public: Boat(int weight=0,float tonnage=0):Vehicle(weight) Boat:tonnage = tonnage; cout“载入Boat类构造函数“endl; void ShowMe() cout“我是船!“endl; protected: float tonnage; ;,class AmphibianCar:public Car,public Boat/水陆两用汽车,多重继承的体现 public: AmphibianCar(int weight,int aird,float tonnage) :Vehicle(weight),Car(weight,aird),Boat(weight,tonnage) /多重继承要注意调用基类构造函数 cout“载入AmphibianCar类构造函数“endl; void ShowMe() cout“我是水陆两用汽车!“endl; void ShowMembers() cout“重量:“weight“顿,“空气排量:“aird“CC,“排水量:“tonnage“顿“endl; ; int main() AmphibianCar a(4,200,1.35f); a.ShowMe(); a.ShowMembers(); a.SetWeight(3); a.ShowMembers(); system(“pause“); ,上次课内容回顾,面向对象方法学基本概念: 对象:object 类:class 方法:method 属性: 继承:inheritance 多态性:polymorphism 重载:overloading,ARIA : ArAction Class Reference,ArPose Pose; ArRobot robot; ArSick sick; robot.addRangeDevice(,Aria Robot 程序,9.3 面向对象建模,所谓模型,就是为了理解事物而对事物作出的一种抽象,是对事物的一种无歧义的书面描述。 通常,模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。 更进一步讲,模型是一种思考工具,利用这种工具可以把知识规范地表示出来。,9.3 面向对象建模,用面向对象方法开发软件,通常需要建立3种形式的模型, 描述系统数据结构的对象模型, 描述系统控制结构的动态模型 描述系统功能的功能模型。 这3种模型都涉及到数据、控制和操作等共同的概念,只不过每种模型描述的侧重点不同。,UML(Unified Modeling Language,统一建模语言)是一种可视化的建模语言,它能让系统构造者用标准的、易于理解的方式建立起能够表达出他们想象力的系统蓝图,并且提供了便于不同的人之间有效地共享和交流设计结果的机制。,交流思想是极为重要的。在UML出现以前,系统开发往往是无计划的议题。系统分析员尽力去获取客户的需求,用某种他自己能够理解(但客户不一定总能理解)的表示法来产生需求分析文档,然后将这个分析转交给个程序员或者一个程序员小组,并且期待着最后所开发出的系统正是客户所需要的。,由于系统开发是项人力活动,因此在开发过程的每个阶段中都很可能潜伏着错误。 系统分析员可能没有正确理解客户的需求。 他编制的文档存户可能不能理解。 系统分析的结果对程序员来说可能很不明确,随后程序员据此构造出的程序很可能不仅难以使用而且根本不是客户所需要的最初问题的解决方案。 怎么办呢?,在计算机时代的早期,程序员们在编制程序之前几乎很少对手头问题进行详细的分析。通常他们一开始就自底向上地编写程序,随着时间的进展代码不断扩充。在今天这样一个高商业风险的社会里,这样做被证明是不适当的。,随着世界变得越来越复杂,存在于这个世界中的基于计算机的系统也增加了复杂性。这些计算机系统通常包括多个硬件和软件单元、跨越长距离的网络设施,还要连接到信息量堆积如山的数据库上。如果你要创建一个成功的系统,怎么来对付这些问题的复杂性呢?最关键的一点是要用一种系统分析员、客户、程序员和其他系统开发所涉及到的人员之间能够照解和达成一致的方式来组织系统的设计过程。UML就提供了这种组织方式。,可靠的设计需要一种能被系统分析员、开发人员和客户接受为标准的设计表示法,就象电子工程师在绘制电路图时所用的标准表示法和在机械工程中被作为标准的三视图所用的表示法那样。UML就是软件开发领域的这种表示法。,UML的诞生,UML是Grady Booch、James Rumbaugh和Ivar Jacobson智慧的结晶。他们被人们称为“UML三友 ”。这几位先生在20世纪80年代和90年代的初期分别在不同的组织里工作,各自设计他们自己的面向对象分析与设计方法学。他们的方法学和其他同行竞争者相比取得了卓越的成果。到90年代中期,他们开始相互借鉴,然后决定相互合作共同推进这项工作。,1994年, Rumbaugh加入到Ratinoal软件公司工作,而Booch早已经在那里工作。第二年Jacobson也加入了Rational公司的行列。后面的事情,是具有历史意义的。 UML草案版开始在软件工业界流传开来,并且根据大量的反馈信息做了大幅度修改。由于许多公司感到UML能够适应这些公司的战略目标,因此一个UML联盟蓬勃发展起来。联盟的成员包括DEC、Hewlett-Packard、Intellicorp、Microsoft、OracIe、Rational和其他些公司。 1997年,应“对象管理组织”(OMG)向外界征求标准建模语言的建议,联盟制订了UML 1.0版并提交给OMG。,后来联盟继续发展,产生了UML 1.1版,提交给OMG后,于1997年被OMG采纳为标准。1998年OMG接管了UML标准的维护工作,并且又制订了两个新的UML修订版。UML成为软件工业界事实上的标准,并且仍在不断发展。现在UML已经到了1.3版。,在科学和工程技术领域中模型是一个很有用途的概念。在最通常的意义下,当你建立了一个模型后,你其实就在运用你已经了解的很多知识来帮助你理解暂时还不知道的很多东西。在某些领域中,一个模型可能是一组数学方程式;而在另一些领域中,一个模型可能是计算机仿真程序。模型可能有许多种类型。 就我们的目的而言,一个模型是一组UML图,为了理解和开发一个系统,我们可以检查、获取和修改这些图。,9.3 面向对象建模,UML建模语言 一些著名的软件工程专家在提出自己的面向对象方法的同时,也提出了自己的建模语言。 Booch, Rumbaugh和Jacobson经过合作研究,于1996年6月设计出统一建模语言UML 0.9(Unify Modeling Language简称UML) 利用这个工具,可以建立用UML描述的软件系统的模型,而且可以自动生成和维护C+、Java、VB和Oracle等语言和系统的代码。 截止到1996年10月,在美国已有700多家公司表示支持采用UML作为建模语言,在1996年年底,UML已经稳定地占领了面向对象技术市场的85%,成为事实上的工业标准。1997年11月,国际对象管理组织OMG批准把UML 1.1作为基于面向对象技术的标准建模语言。 UML工具:IBM的Rational Rose和MS的Visio Rational Rose是Rational公司出品的一种面向对象的统一建模语言的可视化建模工具. /,UML的统一性(Unified)表现为以下几点:,(1) UML是人类思想和计算机代码的一个连接桥梁 (2) UML所定义的概念和符号可用于软件开发的分析、设计和实现的全过程,软件开发人员不必在开发过程的不同阶段进行概念和符号的转换。 (3) UML所用的语言元素基本都是图形化的,便于理解和沟通,不但开发人员之间可以用来交流,客户和开发人员之间也可以用它作为交流的工具。,UML基础,标准建模语言UML的重要内容可以由下列五类图(共9种图形)来定义: 第一类是用例图,从用户角度描述系统功能,并指出各功能的操作者。,UML基础,第二类是静态图 (Static diagram),包括类图、对象图和包图。 类图描述系统中类的静态结构。不仅定义系统中的类,表示类之间的联系如关联、依赖、聚合等,也包括类的内部结构(类的属性和操作)。 对象图是类图的实例,不同点在于对象图显示类的多个对象实例,而不是实际的类。一个对象图是类图的一个实例。由于对象存在生命周期,因此对象图只能在系统某一时间段存在。 包由包或类组成,表示包与包之间的关系。包图用于描述系统的分层结构。,UML基础,第三类是行为图(Behavior diagram),描述系统的动态模型和组成对象间的交互关系。包括状态图和活动图。 状态图描述类的对象所有可能的状态以及事件发生时状态的转移条件。通常,状态图是对类图的补充。在实用上并不需要为所有的类画状态图,仅为那些有多个状态其行为受外界环境的影响并且发生改变的类画状态图。 活动图描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动。,UML基础,第四类是交互图(Interactive diagram),描述对象间的交互关系。 顺序图显示对象之间的动态合作关系,它强调对象之间消息发送的顺序,同时显示对象之间的交互; 合作图描述对象间的协作关系,合作图跟顺序图相似,显示对象间的动态合作关系。 第五类是实现图 ( Implementation diagram )。其中构件图描述代码部件的物理结构及各部件之间的依赖关系。一个部件可能是一个资源代码部件、一个二进制部件或一个可执行部件。它包含逻辑类或实现类的有关信息。部件图有助于分析和理解部件之间的相互影响程度。,9.4 对象模型,对象模型表示静态的、结构化的系统的“数据”性质。 通常,使用UML提供的类图来建立对象模型。在UML中术语“类”的实际含义是,“一个类及属于该类的对象”。下面简要地介绍UML的类图。,类图描述类及类与类之间的静态关系。类图是一种静态模型,它是创建其他UML图的基础。 1. 定义类 UML中类的图形符号为长方形,用两条横线把长方形分成上、中、下3个区域,分别放类的名字、属性和服务,如图9.5所示。其中下面两个区域可省略。 类名是一类对象的名字。名字应该是富于描述性的、简洁的而且无二义性的。,图9.5 表示类的图,9.4.1 类图的基本符号,2. 定义属性 UML描述属性的语法格式如下: 可见性 属性名: 类型名=初值性质串 属性的可见性(即可访问性)通常有下述3种:公有的(public)、私有的(private)和保护的(protected),分别用加号(+)、减号(-)和井号(#)表示。如果未声明可见性,则表示该属性的可见性尚未定义。注意,没有默认的可见性。 属性名和类型名之间用冒号(:)分隔。类型名表示该属性的数据类型,它可以是基本数据类型,也可以是用户自定义的类型。 例:C中 private double width;-width:double,3. 定义服务 服务也就是操作,UML描述操作的语法格式如下: 可见性 操作名(参数表): 返回值类型性质串 操作可见性的定义方法与属性相同。 参数表是用逗号分隔的形式参数的序列。描述一个参数的语法如下: 参数名: 类型名=默认值 例:C中 Public static void box(double h, double w) +box(h:double,w:double): void,例 对象“圆”的类图,9.4.2 表示关系的符号,类与类之间通常有关联、泛化(继承)、依赖和细化等4种关系。 1. 关联 关联表示两个类的对象之间存在某种语义上的联系,也就是对象之间有相互作用、相互依靠的关系。,3种基本类型:,一对一(1:1),一对多(1:M),多对多(M:N),依据参与关联的对象的数目,(1) 普通关联 普通关联是最常见的关联关系,只要在类与类之间存在连接关系就可以用普通关联表示。普通关联的图示符号是连接两个类之间的直线,如图9.6所示。,图9.6 普通关联示例,通常,关联是双向的,可在一个方向上为关联起一个名字,在另一个方向上起另一个名字(也可不起名字)。,重数表示该类有多少个对象与对方的一个对象连接。 3 表示3个对象 01 表示0到1个对象 115 表示1到15个对象 0*或* 表示0到多个对象 1+或1* 表示1到多个对象 未标明 默认重数是1。,例如,图9.7是一个递归关联(即一个类与它本身有关联关系)的例子。一个人与另一个人结婚,必然一个人扮演丈夫的角色,另一个人扮演妻子的角色。如果没有显式标出角色名,则意味着用类名作为角色名。,图9.7 关联的角色,(2)递归关联(自身关联):一个类可能与它自己发生关联,这样的关联被称为自身关联。在任何关联中都会涉及到参与此关联的对象所扮演的角色(即起的作用). 当一个类的对象可以充当多种角色时,自身关联就可能发生。,(3) 限定关联:限定关联通常用在一对多或多对多的关联关系中,可以把模型中的重数从一对多变成一对一,或从多对多简化成多对一。在类图中把限定词放在关联关系末端的一个小方框内。,图9.8 一个受限的关联,例如,某操作系统中一个目录下有许多文件,在一个目录内文件名确定了惟一一个文件。图9.8利用限定词“文件名”表示了目录与文件之间的关系,可见,利用限定词把一对多关系简化成了一对一关系。,例如,图9.9是一个电梯系统的类模型,队列就是电梯控制器类与电梯类的关联关系上的关联类。从图中可以看出,一个电梯控制器控制着4台电梯,这样,控制器和电梯之间的实际连接就有4个,每个连接都对应一个队列(对象),每个队列(对象)存储着来自控制器和电梯内部按钮的请求服务信息。电梯控制器通过读取队列信息,选择一个合适的电梯为乘客服务。关联类与一般的类一样,也有属性、操作和关联。,(4) 关联类:为了说明关联的性质可能需要一些附加信息。可以引入一个关联类来记录这些信息。关联中的每个连接与关联类的一个对象相联系。关联类通过一条虚线与关联连接。,图9.9 关联类示例,2. 聚集: 聚集也称为聚合,是关联的特例。聚集表示类与类之间的关系是整体与部分的关系。在陈述需求时使用的“包含”、“组成”、“分为部分”等字句,往往意味着存在聚集关系。除了一般聚集之外,还有两种特殊的聚集关系,分别是共享聚集和组合聚集。,(1) 共享聚集 如果在聚集关系中处于部分方的对象可同时参与多个处于整体方对象的构成,则该聚集称为共享聚集。例如,一个课题组包含许多成员,每个成员又可以是另一个课题组的成员,则课题组和成员之间是共享聚集关系,如图9.10所示。一般聚集和共享聚集的图示符号,都是在表示关联关系的直线末端紧挨着整体类的地方画一个空心菱形。,图9.10 共享聚集示例,(2) 组合聚集: 如果部分类完全隶属于整体类,部分与整体共存,整体不存在了部分也会随之消失(或失去存在价值了),则该聚集称为组合聚集(简称为组成)。,3. 泛化 UML中的泛化关系就是通常所说的继承关系,它是通用元素和具体元素之间的一种分类关系。具体元素完全拥有通用元素的信息,并且还可以附加一些其他信息。 例 :C+中类与子类的关系 在UML中,用一端为空心三角形的连线表示泛化关系,三角形的顶角紧挨着通用元素。 注意,泛化针对类型而不针对实例,一个类可以继承另一个类,但一个对象不能继承另一个对象。实际上,泛化关系指出在类与类之间存在“一般-特殊”关系。泛化可进一步划分成普通泛化和受限泛化。,图示抽象类时,在类名下方附加一个标记值abstract,如图9.12所示。图下方的两个折角矩形是模型元素“笔记”的符号,其中的文字是注释,分别说明两个子类的操作drive的功能。 抽象操作仅用来指定该类的所有子类应具有哪些行为。抽象操作的图示方法与抽象类相似,在操作标记后面跟随一个性质串abstract。,(1) 普通泛化 普通泛化与9.2.2节中讲过的继承基本相同,没有具体对象的类称为抽象类。抽象类通常作为父类,用于描述其他类(子类)的公共属性和行为。,图9.12 抽象类示例,图9.13给出一个比较复杂的类图示例,图9.13 复杂类图示例,(2) 受限泛化 可以给泛化关系附加约束条件,以进一步说明该泛化关系的使用方法或扩充方法,这样的泛化关系称为受限泛化。 预定义的约束有4种: 多重、不相交、完全和不完全。这些约束都是语义约束。 多重继承指的是,一个子类可以同时多次继承同一个上层基类,例如图9.14中的水陆两用类继承了两次交通工具类。,图9.14 多重继承示例,与多重继承相反的是不相交继承,即一个子类不能多次继承同一个基类(这样的基类相当于C+语言中的虚基类)。如果图中没有指定多重约束,则是不相交继承,一般的继承都是不相交继承。 完全继承指的是父类的所有子类都已在类图中穷举出来了,图示符号是指定完全约束。 不完全继承与完全继承恰好相反,父类的子类并没有都穷举出来,随着对问题理解的深入,可不断补充和维护,这为日后系统的扩充和维护带来很大方便。不完全继承是一般情况下默认的继承关系。,4. 依赖和细化 (1) 依赖关系 依赖关系描述两个模型元素(类、用例等)之间的语义连接关系: 其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素。 在UML的类图中,用带箭头的虚线连接有依赖关系的两个类,箭头指向独立的类。在虚线上可以带一个版类标签,具体说明依赖的种类. 例如,图9.15表示一个友元依赖关系,该关系使得B类的操作可以使用A类中私有的或保护的成员。,图9.15 友元依赖关系,图9.16 细化关系示例,(2) 细化关系 当对同一个事物在不同抽象层次上描述时,这些描述之间具有细化关系。假设两个模型元素A和B描述同一个事物,它们的区别是抽象层次不同,如果B是在A的基础上的更详细的描述,则称B细化了A,或称A细化成了B。细化的图示符号为由元素B指向元素A的、一端为空心三角形的虚线(注意,不是实线)。 如图9.16所示。细化用来协调不同阶段模型之间的关系,表示各个开发阶段不同抽象层次的模型之间的相关性,常常用于跟踪模型的演变。,9.5 动态模型,动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。 通常,用UML提供的状态图来描绘对象的状态、触发状态转换的事件以及对象的行为(对事件的响应)。 每个类的动态行为用一张状态图来描绘,各个类的状态图通过共享事件合并起来,从而构成系统的动态模型。 动态模型是基于事件共享而互相关联的一组状态图的集合。,9.6 功能模型,功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求。 UML提供的用例图也是进行需求分析和建立功能模型的强有力工具。在UML中把用用例图建立起来的系统模型称为用例模型。 用例模型描述的是外部行为者(actor)所理解的系统功能。用例模型的建立是系统开发者和用户反复讨论的结果,它描述了开发者和用户对需求规格所达成

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论