资源描述
学习目标,掌握什么是面向对象方法学?它有哪些优点。 理解喷泉模型的概念。 理解和掌握的对象、类、继承、多态等概念熟悉面向对象建模的重要性; 掌握对象模型的基本含义、图形元素、建模方法和主要用途; 掌握动态模型的基本含义、图形元素、建模方法和主要用途; 掌握功能/用例模型的基本含义、图形元素、建模方法和主要用途; 了解三种模型早OO方法中地位和作用。,第9章 面向对象方法学引论,面向对象的概念,什么是面向对象 对象 类 消息 继承,第9章 面向对象方法学引论,什么是面向对象,Coad和Yourdon给出了一个定义:“面向对象=对象+类+继承+通信”。 如果一个软件系统是使用这样 4 个概念设计和实现的,则认为这个软件系统是面向对象的。 一个面向对象的程序的每一成份应是对象,计算是通过新的对象的建立和对象之间的通信来执行的。,面向对象的要点:,1. 认为客观世界是由各种对象组成的,任何事物都是对象,复杂的对象可以有比较简单的对象以某种方式组合而成。 2. 把所有对象都划分成各种对象类,每个对象类都定义了一组数据和一组方法。 3. 按照子类(或称为派生类)与父类(或称为基类)的关系,把若干个对象类组成一个层次结构的系统(也称为类等级)。 4. 对象彼此之间仅能通过传递消息互相联系。,面向对象的主要优点:,1. 与人类习惯的思维一致 2. 稳定性好 可重用性好 较易开发出大型软件产品 可维护性好 稳定性好、易于修改、容易理解、容易测试和调试,面向对象技术的优点并不是减少了开发时间, 相反,初次使用这种技术开发软件,可能比用传统的方 法所需要的实践还稍微长一点。,对象(object),对象是面向对象开发方法的基本成份。 每个对象可用它本身的一组属性和它可以执行的一组操作来定义。 属性一般只能通过执行对象的操作来改变。 操作又称为方法或服务,它描述了对象执行的功能,若通过消息传递,还可以为其它对象使用。,面向对象中的基本概念,对象的形象表示,面向对象中的基本概念,对象的特点,以数据为中心 对象是主动的 实现了数据封装 本质上具有并行性 模块独立性,对象的分类,外部实体:与系统交换信息的外部设备、相关子系统、操作员或用户等; 信息结构:问题论域中的概念实体,如信号、报表、显示信息等; 需要记忆的事件:系统执行过程中产生并需要记忆的事件,如单击鼠标,击打键盘等; 角色:与系统交互的人员所扮演的角色,如学生、教师、会计等;,组织机构:有关机构,如公司、部门、小组等; 地点或位置:用做系统环境或问题上下文的场所、位置,如客户地址、收件人地址等; 操作规程:如操作菜单、某种数据输入过程等。,类(class),类是一组具有相同数据结构和相同操作的对象的集合。 类的定义包括一组数据属性和在数据上的一组合法操作。 类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。 在一个类中,每个对象都是类的实例 (Instance),它们都可使用类中的函数。,类 两个四边形对象,Quadrilateral类的每个对象有相同的一组属性和操作。因此,类Quadrilateral提供了一个模板,表示了所有四边形对象。 类常常可看做是一个抽象数据类型(ADT)的实现。但更合适的是把类看做是某种概念的模型。 建立类的实例时常常使用其它类的实例,它们提供了该类所需要的服务。 用到的这些实例应当受到保护不被其它对象存取,包括同一个类的其它实例。,什么是消息?,消息,就是要求某个对象执行在定义它的那个类中所定义的某个操作的规格说明。通常,一个消息有下述三部分组成:,接受消息的对象 消息选择符(也称为消息名) 零个或多个变元,如:myCircle.show(GREEN) 不同于结构化设计中的函数调用。,消息(Message),继承 (Inheritance),继承是使用已有的类定义做为基础建立新类的定义的技术。 新类的定义可以是既存类所声明的数据和新类所增加的声明的组合。新类复用既存的定义,而不要求修改既存类。 既存类可当做基类来引用,则新类相应地可当做派生类来引用。,例:类的继承层次,Polygon,Triangle,Quadrilateral,Rectangle,使用继承设计一个新类,可以视为描述一个新的对象集,它是既存类所描述对象集的子集合。 这个新的子集合可以认为是既存类的一个特殊化。 新类的界面可以等同于既存类的界面,新类的界面还可以被看做是既存类界面的一个扩充界面。例如,从一个既存的车辆类派生的四轮驱动车类可能不仅是车辆类子集合定义的特殊化,而且还可能在新类的界面中引入新的能力。,Polygon,referencePoint Vertices,Draw( ) move(x, y) contains?(aPoint),Quadrilateral,referencePoint Vertices,Draw( ) move(x, y) contains?(aPoint),Polygon类,Polygon类的子类 Quadrilateral,多态性(Polymorphism),在面向对象的软件技术中,多态性是指子类对象可以象父类对象那样使用,同样的消息既可以发送给父类对象也可以发送给子类对象。,多态性机制不仅增加了面向对象软件系统的灵活性,进一步减少了信息冗余,而且显著提高了软件的可重用性和可扩充性。,重载(Overloading),有两种重载: 函数重载是指在同一作用域内的若干个参数特征不 同的函数可以使用相同函数名字。 运算符重载是指同一个运算符可以施加于不同类型的操作数上面。当然,当参数特征不同或被操作数的类 型不同时,实现函数的算法或运算符的语义是不相同的。,对象模型化技术把分析时收集的信息构造在三类模型中,即对象模型、动态模型和功能模型。 这个模型化的过程是一个迭代过程。通过不断更新、细化,直到切合系统的真正需求为止。,对象模型化技术OMT,动态模型,对象模型,功能模型,对象模型,是三个模型中最关键的一个模型,它的作用是描述系统的静态结构,包括构成系统的类和对象,它们的属性和操作,及它们之间的关系。 在OMT中,类与类之间的关系叫做关联。关联代表一组存在于两个或多个对象之间的、具有相同结构和含义的具体连接。关联可以是物理的,也可以是逻辑的。,类名,属性,操作,类,类的实例,(类名) 属性值,类定义示例,正方形,边长 位置 边界颜色 内部颜色,画图 擦图 移动,聚合,代表整体与部分的关系,这是一种特殊形式的关联。 菱形框 表示整体侧对象 限定,用以对关联的含义做某种约束。 角色,用来说明关联的一端。由于多数关联具有两个端点,因而涉及到两个角色。 附加的说明对象之间的连接的连接属性。,(0个或1个),(0个或多个),1+,(1个或多个),12,4,(12个或4个),一般化关联,也称为继承性。一般化关系包含基类和几个派生类。 基类表示了一个较为一般、普遍的概念 每个派生类则是它的某个特殊形态 派生类除了自然地继承基类所具有的属性和操作外,还具有反映自身特点的属性和操作。,1. 定义类 UML中类的图形符号为长方形,用两条横线把长方形分成上、中、下3个区域(下面两个区域可省略),3个区域分别放类的名字、属性和服务。,类图的基本符号,为类命名时应该遵守以下几条准则: (1) 使用标准术语。应该使用在应用领域中人们习惯的标准术语作为类名,不要随意创造名字。例如,“交通信号灯”比“信号单元”这个名字好,“传送带”比“零件传送设备”好。 (2) 使用具有确切含义的名词。尽量使用能表示类的含义的日常用语作名字,不要使用空洞的或含义模糊的词作名字。例如,“库房”比“房屋”或“存物场所”更确切。 (3) 必要时用名词短语作名字。为使名字的含义更准确,必要时用形容词加名词或其他形式的名词短语作名字。例如,“最小的领土单元”、“储藏室”、“公司员工”等都是比较恰当的名字。 总之,名字应该是富于描述性的、简洁的而且无二义性的。,2. 定义属性 UML描述属性的语法格式如下: 可见性 属性名: 类型名=初值性质串 属性的可见性(即可访问性)有3种: 公有的(public) 私有的(private) 保护的(protected) 分别用加号(+)、减号(-)和井号(#)表示。如果未声明可见性,则表示该属性的可见性尚未定义。注意,没有默认的可见性。 属性名和类型名之间用冒号(:)分隔。类型名表示该属性的数据类型,它可以是基本数据类型,也可以是用户自定义的类型。,在创建类的实例时应给其属性赋值,如果给某个属性定义了初值,则该初值可作为创建实例时这个属性的默认值。类型名和初值之间用等号(=)隔开。 用花括号括起来的性质串明确地列出该属性所有可能的取值。例如,“发货单”类的属性“管理员”,在UML类图中像下面那样描述: -管理员: String=“未定”,3. 定义服务 服务也就是操作,UML描述操作的语法格式如下: 可见性操作名(参数表): 返回值类型性质串 操作可见性的定义方法与属性相同。 参数表是用逗号分隔的形式参数的序列。描述一个参数的语法如下: 参数名: 类型名=默认值 当操作的调用者未提供实在参数时,该参数就使用默认值。 与属性类似,在类中也可定义类作用域操作,在类图中表示为带下划线的操作。这种操作只能存取本类的类作用域属性。,类与类之间通常有关联、泛化(继承)、依赖和细化等4种关系。 关联 (1) 普通关联 普通关联是最常见的关联关系,只要在类与类之间存在连接关系就可以用普通关联表示。普通关联的图示符号是连接两个类之间的直线。,表示关系的符号,在表示关联的直线两端可以写上重数(multiplicity),它表示该类有多少个对象与对方的一个对象连接。重数的表示方法通常有: 01表示0到1个对象 0*或*表示0到多个对象 1+或1*表示1到多个对象 115表示1到15个对象 3表示3个对象 如果图中未明确标出关联的重数,则默认重数是1。,(2) 关联的角色 在任何关联中都会涉及到参与此关联的对象所扮演的角色(即起的作用),在某些情况下显式标明角色名有助于别人理解类图。下图是一个递归关联(即一个类与它本身有关联关系)的例子。一个人与另一个人结婚,必然一个人扮演丈夫的角色,另一个人扮演妻子的角色。如果没有显式标出角色名,则意味着用类名作为角色名。,(3) 限定关联 限定关联通常用在一对多或多对多的关联关系中,可以把模型中的重数从一对多变成一对一,或从多对多简化成多对一。例如,某操作系统中一个目录下有许多文件,一个文件仅属于一个目录,在一个目录内文件名确定了惟一一个文件。,(4) 关联类 为了说明关联的性质可能需要一些附加信息。可以引入一个关联类来记录这些信息。关联中的每个连接与关联类的一个对象相联系。关联类通过一条虚线与关联连接。,2. 聚集 聚集也称为聚合,是关联的特例。聚集表示类与类之间的关系是整体与部分的关系。在陈述需求时使用的“包含”、“组成”、“分为部分”等字句,往往意味着存在聚集关系。除了一般聚集之外,还有两种特殊的聚集关系,分别是共享聚集和组合聚集。,(1) 共享聚集 如果在聚集关系中处于部分方的对象可同时参与多个处于整体方对象的构成,则该聚集称为共享聚集。例如,一个课题组包含许多成员,每个成员又可以是另一个课题组的成员,则课题组和成员之间是共享聚集关系,,(2) 组合聚集 如果部分类完全隶属于整体类,部分与整体共存,整体不存在了部分也会随之消失(或失去存在价值了),则该聚集称为组合聚集(简称为组成)。例如,在屏幕上打开一个窗口,它就由文本框、列表框、按钮和菜单组成,一旦关闭了窗口,各个组成部分也同时消失,窗口和它的组成部分之间存在着组合聚集关系。,(1) 普通泛化 没有具体对象的类称为抽象类。抽象类通常作为父类,用于描述其他类(子类)的公共属性和行为。图示抽象类时,在类名下方附加一个标记值abstract 。,3. 泛化,抽象类通常都具有抽象操作。抽象操作仅用来指定该类的所有子类应具有哪些行为。抽象操作的图示方法与抽象类相似,在操作标记后面跟随一个性质串abstract。 与抽象类相反的类是具体类,具体类有自己的对象,并且该类的操作都有具体的实现方法。,复杂类图示例,一个比较复杂的类图示例,(2) 受限泛化 可以给泛化关系附加约束条件,以进一步说明该泛化关系的使用方法或扩充方法,这样的泛化关系称为受限泛化。预定义的约束有4种: 多重、不相交、完全和不完全。这些约束都是语义约束。 多重继承指的是,一个子类可以同时多次继承同一个上层基类, 与多重继承相反的是不相交继承,即一个子类不能多次继承同一个基类(这样的基类相当于C+语言中的虚基类)。如果图中没有指定多重约束,则是不相交继承,一般的继承都是不相交继承。,多重继承示例,完全继承指的是父类的所有子类都已在类图中穷举出来了,图示符号是指定完全约束。 不完全继承与完全继承恰好相反,父类的子类并没有都穷举出来。,4. 依赖和细化 (1) 依赖关系 依赖关系描述两个模型元素(类、用例等)之间的语义连接关系: 其中一个模型元素是独立的,另一个模型元素不是独立的,它依赖于独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素。,(2) 细化关系 当对同一个事物在不同抽象层次上描述时,这些描述之间具有细化关系。假设两个模型元素A和B描述同一个事物,它们的区别是抽象层次不同,如果B是在A的基础上的更详细的描述,则称B细化了A,或称A细化成了B。细化的图示符号为由元素B指向元素A的、一端为空心三角形的虚线(注意,不是实线),,动态模型,要想对一个系统了解得比较清楚,还应当考察在任何时刻对象及其关系的改变。 系统的这些涉及时序和改变状况用动态模型来描述。 动态模型着重于系统的控制逻辑。 它包括三个部分,状态图,事件追踪图和用例图。,状态图,状态图是一个状态和事件的网络,侧重于描述每一类对象的动态行为。 在状态图中,状态是对某一时刻中属性特征的概括。而状态迁移表示这一类对象在何时对系统内外发生的哪些事件做出何种响应。,操作是一个伴随状态迁移的瞬时发生的行为,与触发事件一起表示在有关的状态迁移之上。 活动则是发生在某个状态中的行为,往往需要一定的时间来完成,因此与状态名一起出现在有关的状态之中。 动态模型由多个状态图组成。 对于每一个具有重要动态行为的类都有一个状态图,从而表明所有系统活动的模式。,各个状态图并发地执行,并可以独立地改变状态。 各种类的状态图可以通过共享事件组合到一个动态模型中。,事件,一个事件发生在某一时刻 每个事件都是单独发生的 我们建立事件类,并给每个事件一个名字,以指明共同结构和行为。,事件从一个对象向另一个对象传送信息。 有些事件类可能传送的是简单的信号“要发生某件事”,而有些事件类则可能传送的是数据值。由事件传送的数据值叫做属性。 列车出发(线路、班次、城市) 揿下鼠标按钮(按钮、位置) 拿起电话受话器 数字拨号(数字) 请大家思考电话系统的状态图,事件追踪图,事件追踪图侧重于说明发生于系统执行过程中的一个特定“场景”。 场景也叫做脚本,是完成系统某个功能的一个事件序列。 场景通常起始于一个系统外部的输入事件,结束于一个系统外部的输出事件,它可以包括发生在这个期间的系统所有的内部事件。,铃,铃,声,声,在,在,打,打,电,电,话,话,者,者,的,的,电,电,话,话,上,上,传,传,出,出,接,接,电,电,话,话,者,者,回,回,答,答,接,接,电,电,话,话,者,者,的,的,电,电,话,话,停,停,止,止,振,振,铃,铃,铃,铃,声,声,在,在,打,打,电,电,话,话,者,者,的,的,电,电,话,话,中,中,消,消,失,失,通,通,电,电,话,话,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,.,状态图与事件追踪图的关系,状态图叙述一个对象的个体行为,事件追踪图则给出多个对象所表现出来的集体行为。它们从不同侧面来说明同一系统的行为。 例如,一个事件追踪图指出某一对象在接受一个事件之后发出另一事件,同一行为在此对象的状态图中也应当有所表示。,功能模型,功能模型表明,通过计算,从输入数据能得到什么样的输出数据,不考虑参加计算的数据按什么时序执行。 功能模型由多个数据流图组成,它们指明从外部输入,通过操作和内部存储,直到外部输出,这整个的数据流情况。 功能模型中所有的数据流图往往形成一 个层次结构。,在这个层次结构中,一个数据流图中的过程可以由下一层的数据流图做进一步的说明。 高层的过程相应于作用在聚合对象上的操作,而低层的过程则代表作用于一个简单对象上的操作。 数据流图不表示控制信息,控制信息在动态模型中表示。 数据流图不表示对象中数据的组织,这种信息在对象模型中表示。,数据流图中允许加入控制流,但这样做将与动态模型重复,不提倡夹带控制流。,什么是用例(use case) 用例是帮助分析员和用户确定系统使用 情况的UML组件; 一组用例就是从用户的角度出发如何使 用系统的描述; 可认为用例是系统的一组使用场景;每个场景描述了一个事件的序列;每个序列是由一个人、另一个系统、一个硬件设备或某段时间的流逝所发起;每个发起事件序列的实体叫做参与者(actor)或行动者,POS系统用例图,购买商品,登录,退货,收款员,POS,顾客,启动/关闭,管理用户,其他,管理员,系统管理员,用例建模,用例建模是用于描述一个系统应该做什么的建模技术 用例建模可用于新系统的需求获取,也可用于已有系统的升级,用例模型(use case model),一个用例模型可由若干幅用例图组成 用例描述了用户和系统之间的交互,其重点是系统为用户做什么 用例模型描述全部的系统功能行为 一幅用例图包含的模型元素有: 用例 参与者(行为者、执行者) 系统,系统被看作提供用例的黑盒子 一个用例是可以被行为者感受到的一个完整的功能 行为者是和用户交互的人或其他系统代表一种角色,而不是某个具体的人或物。行为者与用例之间的直线,表示两者之间交换信息,称通信联系。,用例图,用例,参与者,系统,参与者,用例模型表示法,通信 联系,销售系统用例图,购买商品,登录,退货,收款员,POS,顾客,购买商品,退货,商店,顾客,以商店作为系统边界,以POS作为系统边界,POS系统用例图,购买商品,登录,退货,收款员,POS,顾客,启动/关闭,管理用户,其他,管理员,系统管理员,现金结算,登录,收款员,参与者与它们所发起执行的过程(简要描述),退货,购买商品,顾客,关闭系统,启动系统,管理员,增加新用户,系统管理员,用例描述实例,用例: 购买商品 参与者:顾客(发起者)、收款员 类型: 主要的 描述: 顾客带着所要购买商品到付款处,收款员 记录商品信息并收款。,用例: 启动/关闭系统 参与者:管理员 类型: 主要的 描述: 管理员接通一台POS机电源,检查时间、 日期正确性,检查完成后,系统处于就绪 状态,以备收款员使用。,基于三个模型的分析过程,功能模型着重于系统内部数据的传送和处理。 功能模型定义“做什么” 动态模型定义“何时做” 对象模型定义“对谁做”。,对象模型、动态模型和功能模型之间的关系: 针对每个类建立的动态模型,描述了类实例的生命周期或运行周期。 状态转换驱使行为发生,这些行为在数据流图中被映射成处理,它们同时与对象模型中的服务相对应。 功能模型中的处理,对应于对象模型中立类所提供的服务。在顶层数据流图中的处理,对应于复杂对象提供的服务;在低层数据流图中的处理,对应于更基本的对象(基本对象是复杂对象的组成部分)的服务。有时一个处理对应多个服务,也有个服务对应多个处理的时候。,数据流图中的数据存储,以及数据的源点终点(在功能模型中称为动作对象),通常是对象模型中的对象。 数据流图中的数据流,住往是对象模型中的属性值,也可能是整个对象。 用例图中的行为者,可能是对象模型中的对象。 功能模型中的处理可能产生动态模型中的事件 对象模型描述了功能模型中的动作对象、数据存储以及数据流的结构。,小结:,1、面向对象方法的要点以及优点,喷泉模型,面向对象的对象、类、继承、多态等概念。 2、对象模型的创建方法:使用类图建立; 3、动态模型的创建方法:使用状态图建立; 4、功能模型的创建方法:使用用例模型建立。,作业,教材P220,9.1、,9.2、9.3、9.4 9.6、9.8、9.10,
展开阅读全文