《软件工程软件工程软件工程 (9).ppt》由会员分享,可在线阅读,更多相关《软件工程软件工程软件工程 (9).ppt(86页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、2023/3/302023/3/301 1第第第第9 9 9 9章章章章 面向对象方法学引论面向对象方法学引论面向对象方法学引论面向对象方法学引论 9.1 9.1 面向对象方法学概述面向对象方法学概述9.2 9.2 面向对象的概念面向对象的概念9.3 9.3 面向对象建模面向对象建模9.4 9.4 对象模型对象模型9.5 9.5 动态模型动态模型9.6 9.6 功能模型功能模型9.7 39.7 3种模型之间的关系种模型之间的关系2023/3/302023/3/302 29.1.1 9.1.1 9.1.1 9.1.1 要点要点要点要点9.1 概述l 面向对象方法学的面向对象方法学的出发点和基本原
2、则出发点和基本原则,是,是尽可能模尽可能模拟人类习惯的思维方式,使开发软件的方法与拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法过程尽可能接近人类认识世界解决问题的方法与过程与过程,也就是使描述问题的问题空间,也就是使描述问题的问题空间(也称为问题域也称为问题域)与实与实现解法的解空间现解法的解空间(也称为求解域也称为求解域)在结构上尽可能一致。在结构上尽可能一致。u认为客观世界是由各种对象组成的,任何事物都是对象,认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以由比较简单的对象以某种方式组合而成。复杂的对象可以由比较简单的对象以某种方式组合而
3、成。u把所有对象都划分成各种对象类把所有对象都划分成各种对象类(简称为类,简称为类,class),每个,每个对象类都定义了一组数据和一组方法。对象类都定义了一组数据和一组方法。u按照子类按照子类(或称为派生类或称为派生类)与父类与父类(或称为基类或称为基类)的关系,把的关系,把若干个对象类组成一个层次结构的系统若干个对象类组成一个层次结构的系统(也称为类等级也称为类等级)。u对象彼此之间仅能通过传递消息互相联系。对象彼此之间仅能通过传递消息互相联系。2023/3/302023/3/303 3l l 面向对象的方法学可以用下列方程来概括:面向对象的方法学可以用下列方程来概括:OO=objects
4、+classes+inheritance+communication with OO=objects+classes+inheritance+communication with messagesmessages也就是说,面向对象就是既使用对象又使用类和继承等机制,也就是说,面向对象就是既使用对象又使用类和继承等机制,而且对象之间仅能通过传递消息实现彼此通信。而且对象之间仅能通过传递消息实现彼此通信。l l 如果仅使用对象和消息,则这种方法可以称为基于对象的如果仅使用对象和消息,则这种方法可以称为基于对象的(object-based)(object-based)方法,而不能称为面向对象的方法;
5、方法,而不能称为面向对象的方法;l l 如果进一步要求把所有对象都划分为类,则这种方法可称如果进一步要求把所有对象都划分为类,则这种方法可称为基于类的为基于类的(class-based)(class-based)方法,但仍然不是面向对象的方法。方法,但仍然不是面向对象的方法。l l 只有同时使用对象、类、继承和消息的方法,才是真正面只有同时使用对象、类、继承和消息的方法,才是真正面向对象的方法向对象的方法。2023/3/302023/3/304 49.1.2 9.1.2 9.1.2 9.1.2 优点优点优点优点9.1 概述 l 与人类习惯的思维方法一致;与人类习惯的思维方法一致;l 稳定性好;
6、稳定性好;l 可重用性好;可重用性好;l 较易开发大型的软件产品;较易开发大型的软件产品;l 可维护性好。可维护性好。2023/3/302023/3/305 59.1.3 9.1.3 9.1.3 9.1.3 喷泉模型喷泉模型喷泉模型喷泉模型9.1 概述l迭代是软件开发过程中普遍存在的一种内在属性。经验表迭代是软件开发过程中普遍存在的一种内在属性。经验表明,软件过程各个阶段之间的迭代或一个阶段内各个工作明,软件过程各个阶段之间的迭代或一个阶段内各个工作步骤之间的迭代,在面向对象范型中比在结构化范型中更步骤之间的迭代,在面向对象范型中比在结构化范型中更常见。常见。l一般说来,使用面向对象方法学开发
7、软件时,工作重点应一般说来,使用面向对象方法学开发软件时,工作重点应该放在生命周期中的分析阶段。这种方法在开发的早期阶该放在生命周期中的分析阶段。这种方法在开发的早期阶段定义了一系列面向问题的对象,并且在整个开发过程中段定义了一系列面向问题的对象,并且在整个开发过程中不断充实和扩充这些对象。不断充实和扩充这些对象。l 为避免使用喷泉模型开发软件时开发过程过分无序,应为避免使用喷泉模型开发软件时开发过程过分无序,应该把一个线性过程(例如,快速原型模型)作为总目标。该把一个线性过程(例如,快速原型模型)作为总目标。但是,同时也应该记住,面向对象范型本身要求经常对开但是,同时也应该记住,面向对象范型
8、本身要求经常对开发活动进行迭代或求精。发活动进行迭代或求精。2023/3/302023/3/306 69.1.3 喷泉模型述图图9.1 喷泉模型喷泉模型2023/3/302023/3/307 79.2.1 9.2.1 9.2.1 9.2.1 对象对象对象对象9.2 概念l 对象是对问题域中某个实体的抽象,设立某个对象就反映了对象是对问题域中某个实体的抽象,设立某个对象就反映了软件系统具有保存有关它的信息并且与它进行交互的能力。软件系统具有保存有关它的信息并且与它进行交互的能力。l 对象的形象表示:为有助于读者理解对象的概念,图对象的形象表示:为有助于读者理解对象的概念,图9.2形象形象地描绘了
9、具有地描绘了具有3个操作的对象。个操作的对象。图图9.2 对象的形象表示对象的形象表示2023/3/302023/3/308 8l 我们把客观世界的实体称之为问题空间(问题域)的对象。例如,一个人可以是一个对象,一条信息可以是一个对象,一本书可以是一个对象,一家图书馆也可以是一个对象。可见,对象是以初始的对象为基本元素,经过层层组合而成的。因此,整个客观世界可认为是一个最复杂的对象。2023/3/302023/3/309 9l 对象是一个由信息及有关对它进行处理的描述所组成的包。在面向对象的程序设计中,“对象”是系统中的基本运行实体,也就是说,“对象”是具有特殊属性特殊属性(数据)和行为方式行
10、为方式(方法)的实体。u对象的特殊属性就确定了给定时刻对象的状态,用数据值来描述它的状态,例如,用学号、姓名、性别、年龄和专业等数据值描述一个学生对象的状态。u与每一个对象相关的方法定义了该对象上的操作,例如,学生信息登记、学生专业查询等方法定义了学生对象的操作。因此,对象是数据和操作的封装体,如图8.1所示。2023/3/302023/3/301010图9.3 对象 2023/3/302023/3/3011119.2.1 对象 l 定义定义1:对象是具有相同状态的一组操作的集合。这个定义对象是具有相同状态的一组操作的集合。这个定义主要是从主要是从面向对象程序设计的角度看面向对象程序设计的角度
11、看“对象对象”。l 定义定义2:对象是对问题域中某个东西的抽象,这种抽象反映对象是对问题域中某个东西的抽象,这种抽象反映了系统保存有关这个东西的信息或与它交互的能力。也就是了系统保存有关这个东西的信息或与它交互的能力。也就是说,对象是对属性值和操作的封装。这个定义着重说,对象是对属性值和操作的封装。这个定义着重从信息从信息模拟的角度看待模拟的角度看待“对象对象”。l 定义定义3:对象对象=ID,MS,DS,MI。其中,。其中,ID是对象的标识是对象的标识或名字,或名字,MS是对象中的操作集合,是对象中的操作集合,DS是对象的数据结构,是对象的数据结构,MI是对象受理的消息名集合是对象受理的消息
12、名集合(即对外接口即对外接口)。这个定义是一个。这个定义是一个形式化的定义形式化的定义。2023/3/302023/3/301212 对对象象(Object)Object)是是是是客客客客观观观观事事事事物物物物或或或或概概概概念念念念的的的的抽抽抽抽象象象象表表表表述述述述,即即即即对对客客观观存存在在的的事事物物的的描描述述统统称称为为对对象象,对对象象可可以以是是事事、物物、或或抽抽象象概概念念 ,是是将将一一组组数数据据和和使使用用该该数数据据的的一一组组基基本本操操作作或或过过程封装在一起的实体程封装在一起的实体。对对对对 象象象象 都都都都 存存存存 在在在在 一一一一 定定定定
13、的的的的状状态态(state)state),内内内内 部部部部标标识识(identity)identity),可可可可以以以以给给给给对对对对象象象象定定定定义义义义一一组组运运算算(operation),operation),对对对对象象象象通通通通过过过过其其其其运运运运算算算算所所所所展展展展示示示示的的的的特特特特定定定定行行行行为为为为称称称称为为为为对对象象行行为为(behavior),behavior),对对对对象象象象本本本本身身身身的的的的性性性性质质质质称称称称为为为为属属性性(attribute)(attribute),对对对对象象象象将将将将它它它它自自自自身身身身的的
14、的的属属属属性性性性及运算及运算及运算及运算“包装起来包装起来包装起来包装起来”,称为,称为,称为,称为“封装封装”(encapsulation).encapsulation).对象的最基本的特征是封装性和继承性。对象的最基本的特征是封装性和继承性。9.2.1 对象 2023/3/302023/3/3013139.2.1 对象图图9.4 用自动机模拟对象用自动机模拟对象2023/3/302023/3/3014149.2.1 对象对象具有如下一些基本特点:对象具有如下一些基本特点:l以数据为中心。以数据为中心。l 对象是主动的。对象是主动的。l本质上具有并行性。本质上具有并行性。l 模块独立性好
15、。模块独立性好。l实现了数据封装。实现了数据封装。2023/3/302023/3/3015159.2.1 对象.封装u 在面向对象的程序中,把数据和实现操作的代码集中起在面向对象的程序中,把数据和实现操作的代码集中起来放在对象内部。一个对象好像是一个不透明的黑盒子,来放在对象内部。一个对象好像是一个不透明的黑盒子,表示对象状态的数据和实现操作的代码与局部数据,都被表示对象状态的数据和实现操作的代码与局部数据,都被封装在黑盒子里面,从外面是看不见的,更不能从外面直封装在黑盒子里面,从外面是看不见的,更不能从外面直接访问或修改这些数据和代码。使用一个对象的时候,只接访问或修改这些数据和代码。使用一
16、个对象的时候,只需知道它向外界提供的接口形式,无须知道它的数据结构需知道它向外界提供的接口形式,无须知道它的数据结构细节和实现操作的算法。细节和实现操作的算法。u 对象具有封装性的条件如下:对象具有封装性的条件如下:(1)有一个清晰的边界。所有私有数据和实现操作的代码有一个清晰的边界。所有私有数据和实现操作的代码都被封装在这个边界内,从外面看不见更不能直接访问。都被封装在这个边界内,从外面看不见更不能直接访问。(2)有确定的接口(即协议)。这些接口就是对象可以接有确定的接口(即协议)。这些接口就是对象可以接受的消息,只能通过向对象发送消息来使用它。受的消息,只能通过向对象发送消息来使用它。(3
17、)受保护的内部实现。实现对象功能的细节(私有数据受保护的内部实现。实现对象功能的细节(私有数据和代码)不能在定义该对象的类的范围外访问。和代码)不能在定义该对象的类的范围外访问。2023/3/302023/3/301616类类类类(ClassClassClassClass)类类又又称称对对象象类类(Object Object ClassClass),是是是是一一组组具具有有相相同同属属性性和和相相同同操操作作的的对对象象的的集集合合。在在一一个个类类中中,每每个个对对象象都都是是类类的的实实例例(instance),它们都可以使用类中提供的函数。,它们都可以使用类中提供的函数。类类具具有有属属
18、性性,用用数数据据结结构构来来描描述述类类的的属属性性,类类具具有有操操作作,它它是是对对象象的的行行为为的的抽抽象象,操操作作实实现现的的过过程程称称为为方方法法(method),方法,方法有方法名,方法体和参数。有方法名,方法体和参数。由于对象是类的实例,在进行分析和设计时,通常把注由于对象是类的实例,在进行分析和设计时,通常把注意力集中在类上,而不是具体的对象上意力集中在类上,而不是具体的对象上。9.2 概念9.2.2 9.2.2 9.2.2 9.2.2 其它概念其它概念其它概念其它概念2023/3/302023/3/3017179.2 概念 实例:实例:实际上类是建立对象时使用的实际上
19、类是建立对象时使用的“样板样板”,按,按照这个样板所建立的一个个具体的对象,就是类的实际例照这个样板所建立的一个个具体的对象,就是类的实际例子,通常称为子,通常称为实例实例。当使用。当使用“对象对象”这个术语时,既可以这个术语时,既可以指一个具体的对象,也可以泛指一般的对象,但是,当使指一个具体的对象,也可以泛指一般的对象,但是,当使用用“实例实例”这个术语时,必然是指一个具体的对象。这个术语时,必然是指一个具体的对象。2023/3/302023/3/301818几何对象几何对象颜色颜色位置位置移动(移动(delta:矢量):矢量)选择(选择(P:指针型)指针型):布尔型布尔型旋转旋转(角度角
20、度)l l图图图图9.5 9.5 9.5 9.5 对象类的描述对象类的描述对象类的描述对象类的描述人人姓姓 名名:字符串字符串年年 龄龄:整整 型型改换工作改换工作改换地址改换地址文件文件文件名文件名文件大小文件大小最近更新日期最近更新日期打印打印(人人)里斯里斯28绘图员绘图员人民路人民路8号号(人人)张山张山24程序员程序员无无l l图图图图9.6 9.6 9.6 9.6 对象的描述对象的描述对象的描述对象的描述对象和类的描述对象和类的描述对象和类的描述对象和类的描述对象和类一般采用对象和类一般采用对象和类一般采用对象和类一般采用“对象图对象图对象图对象图”和和和和 “类图类图类图类图”来
21、描述。来描述。来描述。来描述。类名类名属性属性运算运算 对象图对象图 类图类图2023/3/302023/3/301919消息消息消息消息(Message)Message)消消消消息息息息就就就就是是是是向向向向对对对对象象象象发发发发出出出出的的的的服服服服务务务务请请请请求求求求(互互相相联联系系、协协同同工工作作等等)。对对象象之之间间的的联联系系可可表表示示为为对对象象间间的的消消息息传传递递,即即对象间的通讯机制。对象间的通讯机制。一一个个消消息息应应该该包包含含以以下下信信息息:消消息息名名、接接收收消消息息对对象象的标识、服务标识的标识、服务标识 、消息和方法、输入信息、回答信息
22、。、消息和方法、输入信息、回答信息。注注注注意意意意:在在在在并并并并发发发发系系系系统统统统中中中中,多多多多个个个个控控控控制制制制线线线线程程程程(Thread Thread Thread Thread of of of of Control)Control)Control)Control)并并并并发发发发执执执执行行行行,情情情情况况况况就就就就复复复复杂杂杂杂得得得得多多多多,消消消消息息息息可可可可以以以以是是是是发发发发出出出出服服服服务务务务请请请请求求求求、提提提提交交交交数数数数据据据据、发发发发布布布布事事事事件件件件信信信信息息息息、或或或或是是是是传传传传递递递递同同
23、同同步步步步控控控控制制制制信信信信息。息。息。息。在在对对象象的的操操作作中中当当一一个个消消息息发发送送给给某某个个对对象象时时,消消息息包含接收对象去执行某种操作的消息。包含接收对象去执行某种操作的消息。2023/3/302023/3/302020l l消息消息(Message)Message)属性:姓名属性:姓名 年龄年龄 单位单位 职称职称 工资工资状态:李立状态:李立 25 计算机系计算机系 讲师讲师 900方法:调工资方法:调工资 (计算公式)(计算公式)评职称评职称 (步骤、条件)(步骤、条件)李立,调工资(李立,调工资()数数据据结结构构数数据据值值人事处向对象发消息人事处向
24、对象发消息执行执行的的操作操作方方法法体体类:教师类:教师对象:李立对象:李立抽象抽象实例实例抽象抽象实例实例抽象抽象方法名(参数)方法名(参数)图9.7 对象、类和消息传递2023/3/302023/3/3021219.2 概念l 方法:方法:就是对象所能执行的操作,也就是类中所定义就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,响应消息的方的服务。方法描述了对象执行操作的算法,响应消息的方法。在法。在C+语言中把方法称为成员函数。语言中把方法称为成员函数。l 属性:属性:就是类中所定义的数据,它是对客观世界实体就是类中所定义的数据,它是对客观世界实体所具有的性
25、质的抽象。类的每个实例都有自己特有的属性所具有的性质的抽象。类的每个实例都有自己特有的属性值。在值。在C+语言中把属性称为数据成员。语言中把属性称为数据成员。2023/3/302023/3/302222 继承继承继承继承 (InheritanceInheritanceInheritanceInheritance)继继承承是是使使用用现现存存的的定定义义作作为为基基础础,建建立立新新定定义义的的技技术术。是是父父类类和和子子类类之之间间共共享享数数据据结结构构和和方方法法的的机机制制,这这是是类类之之间间的的一一种种关关系系。在在定定义义和和实实现现一一个个类类的的时时候候,可可以以在在一一个个
26、已已经经存存在在的的类类的的基基础础上上来来进进行行,把把这这个个已已经经存存在在的的类类所所定定义义的的内内容容做做为为自自己的内容,并加入若干新内容。己的内容,并加入若干新内容。继承性分:继承性分:单重继承:一个子类只有一个父类。即单重继承:一个子类只有一个父类。即子类只继承一个父类子类只继承一个父类 的数据结构和方法。的数据结构和方法。多重继承:一个子类可有多个父类。继承多个多重继承:一个子类可有多个父类。继承多个父类的数据结父类的数据结 构和方法。构和方法。基类基类子类子类A子类子类B图 9.9 继承性描述现存类定义现存类定义父类父类(基类基类)新类定义新类定义子类子类(派生类派生类)
27、继继 承承图 9.8 继承性2023/3/302023/3/302323图图9.8 实现继承机制的原理实现继承机制的原理2023/3/302023/3/302424l l 多态性:多态性:(Polymorphism)(Polymorphism)是指相同的操作或函是指相同的操作或函数,过程作用于不同的对象上并获得不同的结果。数,过程作用于不同的对象上并获得不同的结果。多态即一个名字可具有多种语义。多态即一个名字可具有多种语义。即相同的操作即相同的操作的消息发送给不同的对象时,每个对象将根据自己的消息发送给不同的对象时,每个对象将根据自己所属类中所定义的操作去执行,故产生不同的结果。所属类中所定义
28、的操作去执行,故产生不同的结果。例如:例如:“绘图绘图”操作,作用在操作,作用在“椭圆椭圆”和和“矩形矩形”上,画出不同的图形。上,画出不同的图形。l l 有两种重载:函数重载和运算符重载有两种重载:函数重载和运算符重载2023/3/302023/3/302525l l函数重载函数重载是指同一个函数名可以对应着多个函数的实现。每种是指同一个函数名可以对应着多个函数的实现。每种实现对应着一个函数体,这些函数的名字相同,但是函数的参实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同。这就是函数重载的概念。函数重载在类和对象数的类型不同。这就是函数重载的概念。函数重载在类和对象的应用
29、尤其重要。的应用尤其重要。l l函数重载要求编译器能够唯一地确定调用一个函数时应执行哪函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。这就是说,进行函数重载时,函数参数的个数和类型上来区分。这就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则,要求同名函数在参数个数上不同,或者参数类型上不同。否则,将无法实现重载。将无法实现重载。l l例如,可以给函数名例如,可以给函数名add()add()定义多个函数实现,该函数的功能定义
30、多个函数实现,该函数的功能是求和,即求两个操作数的和。其中,一个函数实现是求两个是求和,即求两个操作数的和。其中,一个函数实现是求两个intint型数之和,另一个实现是求两个浮点型数之和。型数之和,另一个实现是求两个浮点型数之和。2023/3/302023/3/302626l l下面举一个在参数类型不同的重载函数的例子:下面举一个在参数类型不同的重载函数的例子:l l#include#include l lint add(int,int);int add(int,int);l ldouble add(double,double);double add(double,double);l lvoi
31、d main()void main()l l l l std:coutadd(5,10)endl;std:coutadd(5,10)endl;l l std:coutadd(5.0,10.5)endl;std:coutadd(5.0,10.5)endl;l l l lint add(int x,int y)int add(int x,int y)l l l l return x+y;return x+y;l l l ldouble add(double a,double b)double add(double a,double b)l l l l return a+b;return a+b;l
32、 l 2023/3/302023/3/302727l l下面举一个在参数个数上不相同的重载函数的例子:下面举一个在参数个数上不相同的重载函数的例子:l l#include#include l lint min(int a,int b);int min(int a,int b);l lint min(int a,int b,int c);int min(int a,int b,int c);l lint min(int a,int b,int c,int d);int min(int a,int b,int c,int d);l lint main(void)int main(void)l l
33、l l coutmin(13,5,4,9)endl;coutmin(13,5,4,9)endl;l l coutmin(-2,8,0)endl;coutmin(-2,8,0)endl;l l l lint min(int a,int b)int min(int a,int b)l l l l return ab?a:b;return ab?a:b;l l l lint min(int a,int b,int c)int min(int a,int b,int c)l l l l int t=min(a,b);int t=min(a,b);l l return min(t,c);return m
34、in(t,c);l l l lint min(int a,int b,int c,int d)int min(int a,int b,int c,int d)l l l l int t1=min(a,b);int t1=min(a,b);l l int t2=min(c,d);int t2=min(c,d);l l return min(t1,t2);return min(t1,t2);l l 2023/3/302023/3/302828l l重载函数的参数类型和参数个数一定要不同(即:要么参数的类型不同,要么参数的个数不同,要么参数的类型和个数都不同),否则,编译器就不知道该调用那个函数了。
35、2023/3/302023/3/302929l l运算符重载是指同一个运算符可以施加于不同类型的操作数上面。当然,当参数特征不同或被操作数的类型不同时,实现函数的算法或运算符的语义是不相同的。重载进一步提高了面向对象系统的灵活性和可读性。2023/3/302023/3/3030309.3 9.3 9.3 9.3 面向对象建模面向对象建模面向对象建模面向对象建模9.3 面向对象建模l 建模是问题域中定义软件解的一种方法。系统开发中,要解决一个实际问题,也就是求该问题的软件解。在解决问题之前,必须首先理解所要解决的问题,其次才是求解。只有对问题理解透彻了,才能解决它。这时我们可以借助于建模的方法来
36、理解问题并解决问题。建模将问题域的解定义成一种模型,以帮助系统分析人员更好地理解问题。2023/3/302023/3/303131l 模型是为了理解问题而对问题作出的一种抽象,而且是对问题的一种无歧义的描述。模型由一组图示符号和组织这些符号的规则组成,利用它们来定义和描述问题域中的术语和概念。或者说,模型是一种思考工具,利用它可以把问题的解规范地表示出来,帮助我们思考问题、定义术语和选择术语以理解问题。9.3 面向对象建模2023/3/302023/3/303232l 建模的目的主要是为了减少复杂性。在开发复杂的软件系统时,系统分析员应该从不同角度抽象出目标系统的特性。使用精确的表示方法构造系
37、统的模型,验证模型是否满足用户对目标系统的需求,并在设计过程中逐渐把和实现有关的细节加进模型中,直至最终用程序实现模型。对于那些特别复杂而不能直接理解的系统,更需要建立模型,把复杂的系统分解成若干个子系统、子部分,从而降低系统的复杂程度。9.3 面向对象建模2023/3/302023/3/303333l 当系统分析员面对复杂的系统束手无策时,建模是一种有效的方法,模型是一种有效的机制。l 建立模型后,需要经受用户和各个领域专家的严格评审。审查是为了发现错误和找出目标系统中冗余的需求。然后,清除错误,剔除冗余的需求,挖掘潜在的需求,通过多次修改逐步优化模型,促使软件开发人员透彻地理解问题,从而为
38、软件设计奠定坚实的基础。9.3 面向对象建模2023/3/302023/3/303434l l 用面向对象方法开发软件,通常需要建立用面向对象方法开发软件,通常需要建立3 3种形式的模型,种形式的模型,它们分别是:它们分别是:uu描述系统数据结构的对象模型。描述系统数据结构的对象模型。uu描述系统控制结构的动态模型。描述系统控制结构的动态模型。uu描述系统功能的功能模型。描述系统功能的功能模型。l l 这这3 3种模型都涉及到数据、控制和操作等共同的概念,只种模型都涉及到数据、控制和操作等共同的概念,只不过每种模型描述的侧重点不同。这不过每种模型描述的侧重点不同。这3 3种模型从种模型从3 3
39、个不同但个不同但又密切相关的角度模拟目标系统,它们各自从不同侧面反又密切相关的角度模拟目标系统,它们各自从不同侧面反映了系统的实质性内容,综合起来则全面地反映了对目标映了系统的实质性内容,综合起来则全面地反映了对目标系统的需求。系统的需求。一个典型的软件系统组合了上述一个典型的软件系统组合了上述3 3方面内容:方面内容:它使用数据结构它使用数据结构(对象模型对象模型),执行操作,执行操作(动态模型动态模型),并且,并且完成数据值的变化完成数据值的变化(功能模型功能模型)。9.3 面向对象建模2023/3/302023/3/303535 2.2.面向对象模型面向对象模型 面向对象建模是用面向对象
40、技术和方法来定义、描述问题域中的软件解的。对问题域的理解,同样也是面向对象方法开发软件的关键。面向对象方法最基本的原则,是按照人们习惯的思维方式,用面向对象观点建立问题域的模型,开发出尽可能自然地表现求解方法的软件。2023/3/302023/3/303636l l为了全面地理解问题域,对任何大系统来说,上述为了全面地理解问题域,对任何大系统来说,上述3 3种模种模型都是必不可少的。型都是必不可少的。l l当然,在不同的应用问题中,这当然,在不同的应用问题中,这3 3种模型的相对重要程度种模型的相对重要程度会有所不同,但是,用面向对象方法开发软件,在任何情会有所不同,但是,用面向对象方法开发软
41、件,在任何情况下,对象模型始终都是最重要、最基本、最核心的。况下,对象模型始终都是最重要、最基本、最核心的。l l在整个开发过程中,在整个开发过程中,3 3种模型一直都在发展、完善。种模型一直都在发展、完善。uu在在面向对象分析面向对象分析过程中,构造出完全独立于实现的过程中,构造出完全独立于实现的应用域模型;应用域模型;uu在在面向对象设计面向对象设计过程中,把求解域的结构逐渐加入过程中,把求解域的结构逐渐加入到模型中;到模型中;uu在在实现实现阶段,把应用域和求解域的结构都编成程序阶段,把应用域和求解域的结构都编成程序代码并进行严格的测试验证。代码并进行严格的测试验证。9.3 面向对象建模
42、2023/3/302023/3/3037379.4 9.4 9.4 9.4 对象模型对象模型对象模型对象模型9.4 对象模型l 对象模型描述了系统的数据结构,它是三个模型的最关键的一个模型。对象模型的作用是描述系统的静态结构,包括构成系统的类和对象、它们的属性和操作,以及它们之间的联系。面向对象方法是以对象为基础来构造系统,而不是以功能为基础来构造系统的。对象模型为建立动态模型和功能模型提供了实质性的框架。对象模型是基础,动态模型和功能模型在此基础上创建。也就是说,一个系统只有创建了对象模型,才能创建动态模型和功能模型。2023/3/302023/3/3038389.4 对象模型l为了建立对象
43、模型,为了建立对象模型,需要定义一组图形符号,并需要定义一组图形符号,并且规定一组组织这些符号以表示特定语义的且规定一组组织这些符号以表示特定语义的规则规则。也就是说,需要用适当的建模语言来表达模型,建。也就是说,需要用适当的建模语言来表达模型,建模语言由记号(即模型中使用的符号)和使用记号的规则模语言由记号(即模型中使用的符号)和使用记号的规则(语法、语义和语用)组成。(语法、语义和语用)组成。l 使用使用UMLUML提供的类图来建立对象模型。在提供的类图来建立对象模型。在UML中术语中术语“类类”的实际含义是,的实际含义是,“一个类及属于该类的对象一个类及属于该类的对象”。下。下面简要地介
44、绍面简要地介绍UML的类图。的类图。2023/3/302023/3/3039399.4.1 类图的基本符号l 定义类:定义类:UML中类的图形符号为长方形,用两条横线把长方形分成上、中、下3个区域(下面两个区域可省略),3个区域分别放类的名字、属性和服务,如图9.10所示。图9.9 表示类的图2023/3/302023/3/304040l l 类名是一类对象的名字。命名是否恰当对系统的可理解类名是一类对象的名字。命名是否恰当对系统的可理解性影响相当大,因此,为类命名时应该遵守以下几条准则:性影响相当大,因此,为类命名时应该遵守以下几条准则:(1)(1)使用标准术语使用标准术语。应该使用在应用领
45、域中人们习惯的标。应该使用在应用领域中人们习惯的标准术语作为类名,不要随意创造名字。例如,准术语作为类名,不要随意创造名字。例如,“交通信号交通信号灯灯”比比“信号单元信号单元”这个名字好,这个名字好,“传送带传送带”比比“零件传零件传送设备送设备”好。好。(2)(2)使用具有确切含义的名词使用具有确切含义的名词。尽量使用能表示类的含义。尽量使用能表示类的含义的日常用语作名字,不要使用空洞的或含义模糊的词作名的日常用语作名字,不要使用空洞的或含义模糊的词作名字。例如,字。例如,“库房库房”比比“房屋房屋”或或“存物场所存物场所”更确切。更确切。(3)(3)必要时用名词短语作名字必要时用名词短语
46、作名字。为使名字的含义更准确,必。为使名字的含义更准确,必要时用形容词加名词或其他形式的名词短语作名字。例如,要时用形容词加名词或其他形式的名词短语作名字。例如,“最小的领土单元最小的领土单元”、“储藏室储藏室”、“公司员工公司员工”等都是等都是比较恰当的名字。比较恰当的名字。总之,名字应该是富于描述性的、简洁的而且无二义性总之,名字应该是富于描述性的、简洁的而且无二义性的。的。9.4.1 类图的基本符号定义类2023/3/302023/3/304141l l 定义属性:定义属性:UMLUML描述属性的语法格式如下:描述属性的语法格式如下:可见性可见性 属性名:属性名:类型名类型名=初值初值
47、性质串性质串 属性的可见性(即可访问性)通常有下述属性的可见性(即可访问性)通常有下述3 3种:公有的种:公有的(public)(public)、私有的、私有的(private)(private)和保护的和保护的(protected)(protected),分别,分别用加号(用加号(+)、减号()、减号(-)和井号()和井号(#)表示。如果未声明可)表示。如果未声明可见性,则表示该属性的可见性尚未定义。注意,没有默认见性,则表示该属性的可见性尚未定义。注意,没有默认的可见性。的可见性。l l 属性名和类型名之间用冒号(:)分隔。类型名表示该属性名和类型名之间用冒号(:)分隔。类型名表示该属性的
48、数据类型,它可以是基本数据类型,也可以是用户属性的数据类型,它可以是基本数据类型,也可以是用户自定义的类型。自定义的类型。l l在创建类的实例时应给其属性赋值,如果给某个属性定义在创建类的实例时应给其属性赋值,如果给某个属性定义了初值,则该初值可作为创建实例时这个属性的默认值。了初值,则该初值可作为创建实例时这个属性的默认值。类型名和初值之间用等号(类型名和初值之间用等号(=)隔开。)隔开。9.4.1 类图的基本符号定义属性2023/3/302023/3/304242l l 用花括号括起来的性质串明确地列出该属性所有可能的用花括号括起来的性质串明确地列出该属性所有可能的取值。枚举类型的属性往往
49、用性质串列出可以选用的枚举取值。枚举类型的属性往往用性质串列出可以选用的枚举值,不同枚举值之间用逗号分隔。也可以用性质串说明属值,不同枚举值之间用逗号分隔。也可以用性质串说明属性的其他性质,例如,约束说明性的其他性质,例如,约束说明 只读只读 表明该属性是只读属表明该属性是只读属性。性。例如,例如,“发货单发货单”类的属性类的属性“管理员管理员”,在,在UMLUML类图中像类图中像下面那样描述:下面那样描述:-管理员:管理员:String=“String=“未定未定”l l 类的属性中还可以有一种能被该类所有对象共享的属性,类的属性中还可以有一种能被该类所有对象共享的属性,称为类的作用域属性,
50、也称为类变量。称为类的作用域属性,也称为类变量。C+C+语言中的静态数语言中的静态数据成员就是这样的属性。类变量在类图中表示为带下划线据成员就是这样的属性。类变量在类图中表示为带下划线的属性,例如,发货单类的类变量的属性,例如,发货单类的类变量“货单数货单数”,用来统计,用来统计发货单的总数,在该类所有对象中这个属性的值都是一样发货单的总数,在该类所有对象中这个属性的值都是一样的,下面是对这个属性的描述:的,下面是对这个属性的描述:-货单数:货单数:IntegerInteger9.4.1 类图的基本符号定义类2023/3/302023/3/304343l l 定义服务定义服务uu服务也就是操作