【面向对象方法】
基本概念
对象,现实世界中各种各样的实体,既可以指具体的事物,也可以指抽象的事物。
类,具有相似内部状态和运动规律的实体的集合,类的内部状态是指类集合中对象的共同状态,类的运动规律是指类集合中对象的共同运动规律。
类是对象的抽象,对象是类的实例
消息,是对象间相互联系和相互作用的方式
继承,是不同抽象级别类之间的关系,面向对象方法学是按照子类与父类的关系,把若干个类组成一个层次结构的软件系统
子类是抽象出来的特殊类,父类是抽象级别更高的一般类,子类可以继承父类的所有内部状态和运动规律
封装,把数据和实现操作的代码集中起来放在内部,对象之间不用过多的了解对方内部的具体状态或运动规律,只需要通过调用接口来进行消息传递
多态,同名的方法在不同的类中具有不同的运动规律
重载,类的同名方法在给其传递不同参数时具有不同的运动规律
包,现实世界中不同对象间的相互联系和相互作用构成了不同的系统,不同系统间的相互联系和相互作用构成了更庞大的系统
特征
- 把数据和操作封装在一起,形成对象,对象是构成软件系统的基本构件
- 把特征相似的对象抽象为类
- 类之间可以存在继承或被继承的关系,形成软件系统的层次结构
- 对象之间通过发送消息进行通信
- 将对象的私有信息封装起来,外界不能直接访问对象的内部信息,而必须是发送相应的消息后,通过有限的接口来访问
面向对象的方法的最重要的特点就是把事物的属性和操作组成一个整体,从问题域中客观存在的事物出发来识别对象并建立由这些对象所构成的系统。
实施步骤
首先,进行面向对象分析,从问题陈述入手,分析和构造所关心的现实世界问题域的模型,并用相应的符号系统表示,模型必须是简洁、明确地抽象目标系统必须做的事,而不是如何做,分析步骤如下:
- 确定问题域,包括定义论域,选择论域,根据需要细化和增加论域 - 区分类和对象,包括定义对象、定义类、命名
- 区分整体对象以及组成部分,确定类的关系以及结构
- 定义属性,包括确定属性、安排属性
- 定义服务,包括确定对象状态、确定所需服务、确定消息联结
- 确定附加的系统约束
其次,进行面向对象设计,其与传统的以功能分解为主的设计有所不同,具体设计步骤如下:
- 应用面向对象分析,对用其他方法得到的系统分析的结果进行改进和完善
- 设计交互过程和用户接口
- 设计任务管理,根据前一步骤确定是否需要多重任务,确定并发性,确定以何种方式驱动任务,设计子系统以及任务之间的协调与通信方式,确定优先级
- 设计全局资源,确定边界条件,确定任务或子系统的软、硬件分配 - 对象设计
再次,进行面向对象实现,使用面向对象语言实现面向对象的设计相对比较容易,如果用非面向对象语言实现面向对象的设计时,特别需要注意和规定保留程序的面向对象结构。
最后,进行面向对象测试,对实现的程序进行测试,包括模型测试、类测试、交互测试、系统测试、验收测试等
【统一建模语言 UML】
概述
统一建模语言(UML,Unified Modeling Language)是一种通用的可视化建模语言,可以用来描述、可视化、构造和文档化软件密集型系统的各种构件,是目前最流行的面向对象建模语言
UML 是一种标准的图形化建模语言,它是面向对象分析与设计的一种标准表示,可以用来捕获系统静态结构和动态行为的信息,其是独立于过程的,适用于各种软件开发方法、软件生命周期的各个阶段、各种应用领域以及各种开发工具
UML 不是一种程序设计语言,但用 UML 描述的模型可以和各种编程语言相联系
特点
UML 具有以下几个特点:
- 统一标准
- 面向对象
- 可视化,表达能力强大
- 独立于过程
- 容易掌握使用
- 利用某些编程语言可以根据 UML 自动生成代码框架
应用范围
UML 以面向对象的方式来描述系统,最广泛的应用是对软件系统进行建模,但它同样适用于许多非软件系统领域的系统
理论上来说,任何具有静态结构和动态行为的系统都可以使用 UML 进行建模
当 UML 应用于大多数软件系统的开发过程时,它从需求分析阶段到系统完成后的测试阶段都能起到重要作用
图形表示
UML 主要用图来表达模型的内容,而图又由代表模型元素的图形符号组成
UML 的主要内容可以由下列 9 种图来表示:
UML 用模型来描述系统的静态特征结构及动态特征行为,从不同的角度为系统建模,从而形成不同的视图,因此上述的 9 种图可分为以下 5 类视图:
建模机制
UML 建模机制分为以下三种:
- 静态建模机制:用例图、类图、对象图、包图
- 动态建模方式:顺序图、协作图、状态图、活动图
- 物理架构机制:构件图、部署图
静态建模机制,关心的是类与对象间的关系;动态建模机制,关心的是系统的动态行为;物理架构机制关心的是系统该如何实现
【用例图】
概述
用例图属于静态建模方式,是从用户的角度描述系统的功能,用例建模用于描述系统需求,主要元素有:
- 用例:对一组动作序列的描述,系统通过执行这一组动作序列为参与者产生一个可观察的结果
- 参与者:外部用户或外部实体在系统中扮演的角色
- 关系连线:参与者执行用例的关系、参与者与参与者之间的关系、用例与用例之间的关系
建立模型顺序
建立用例模型的顺序是:
- 确定谁会直接使用该系统,这些都是参与者
- 选取其中一个参与者
- 定义该参与者希望系统做什么,参与者希望系统做的每件事成为一个用例
- 对每件事来说,何时参与者会使用系统,通常会发生什么,即用例的基本过程
- 描述该用例的基本过程
- 考虑一些可变情况,把他们创建为扩展用例
- 复审不同用例的描述,找出其中的相同点,抽出相同点作为共同的用例
- 重复步骤 2~7 找出每一个用例
用例关系
用例之间存在关系 3 种关系:
如果系统用例较多,不同的用例之间存在共同行为,可以将这些共同行为提取出来,单独组成一个用例,当其他用例使用这个用例之时,它们就构成了包含关系
在用例的执行过程中,可能出现一些异常行为,也可能会在不同的分 支行为中选择执行,这时可将异常行为与可选分支抽象成一个单独的 扩展用例,这样扩展用例与主用例之间就构成了扩展关系
用例之间的泛化关系描述用例的一般与特殊关系,不同的子用例代 表了父用例的不同实现
【类图与对象图】
概述
类图属于静态建模方式,使用类和对象描述系统的结构,展示了系统中类的静态结构,即类与类之间的相互关系,一个系统有多幅类图,一个类也可以出现在几幅类图中
类之间有多种联系方式:
- 关联:相互连接
- 依赖:一个类依赖于或使用另一个类
- 泛化:一个类是另一个类的特殊情况
对象图是类图的实例,它展示了系统在某一时刻的快照,对象图使用与类图相同的符号,只是在对象名下面加上下划线
表示
在 UML 中,类用具有 3 个分隔线的矩形表示,顶层分隔表示类或对象的名字,中间表示属性,底层表示操作
类属性的语法为:[可见性] 属性名[:类型][=初值]
,其中可见性有:
- 公有(+):可被外部对象访问
- 私有(-):不可为外部对象访问,只能为本类对象使用
- 保护(#):可为本类对象和子类对象访问
类操作的语法为:[可见性]操作名[(参数列表)] [:返回类型]
类的版型
类的版型是在建立对象模型时来区分实体类、边界类和控制类,以便更好地理解系统:
- 实体类:用于对必须存储的信息和相关行为建模的类
- 边界类:位于系统与外界的交界处,例如:窗体、对话框、直接与外部设备交互的类
- 接口类:描述一个类或构件服务的操作集,不含属性,只包含方法的声明
- 控制类:每个用例通常有一个控制类,控制用例中的事件顺序,控制类也可以在多个用例间共用
类间关系
在类与类之间,具有不同的关系,比如:关联、依赖、泛化和实现等。
关联关系
关联是模型元素间的一种语义关系,是对具有共同的结构特性、行为特性、关系和语义的链的描述
UML 中使用一条直线表示关联关系,直线两端上的数字表示重数,重数表示关联链的条数,链的两端的 数字 1
和 符号 *
表示的就是重数
重数可以是一个任意的自然数集合,但实际使用中,大于 1 的重数常常 用 *
代替,所以实际使用的重数多为 0、1、*
在不同关联中,两端的重数不同:
- 一对一关联的两端重数都是
1
- 一对多关联的一端的重数是
1
,另一端是*
- 多对多关联的两端重数都是
0~n
,常表示为*
- 若一端是
1…*
则表示这一端有 1 到多个对象
关联类是一种充当关联关系的类,和类一样具有自己的属性和操作,使用虚线连接自己和关联符号,关联类依赖于连接类,没有连接类时,关联类不能单独存在。任何关联类都可以表示成一个类和简单关联关系,但常常采用关联类的表示方式,以便更加清楚地表示关联关系
常见的关联类型有:
- 二元关联:两个类之间的关联
- 多元关联:一对多或多对多的关联
- 三元关联:使用菱形符号连接关联类
- 受限关联:用于一对多或多对多的关联,如果关联时需要从多重数的端中指定一个对象来限定,可以通过使用限定符来指定特定对象
聚合关系与组合关系
聚合与组合其实都是关联的特例,都是整体和部分的关系
他们的区别在于聚合的两个对象之间是可分离的,他们具有各自的生命周期,组合往往表现为一种唇齿相依的关系
聚合关系:一种容纳或包含的关系,如同机场和飞机,汽车和轮胎的关系
组合关系:也可称之为强聚合,整体和部分是不可分的,整体的生命周期结束时也就是部分的生命周期到头时,比如桌子和桌子腿的关系
依赖关系
依赖关系,表示的是两个元素之间语义上的连接关系
对于两个元素 X 和 Y,如果元素 X 的变化会引起对另一个元素 Y的变化,则称元素 Y 依赖于 X
依赖关系使用一个指向提供者的虚线箭头来表示
泛化关系
泛化关系,描述类的一般-特殊关系,是更一般描述与更特殊描述之间的一种分类学关系,特殊描述常常是建立在一般描述基础上的
特殊类是一般类的子类,而特殊类还可以是另一个特殊类的子类,泛化的这种特点构成泛化的分层结构
实现关系
实现关系,是指一个类描述了另一个类保证实现的合约
子类与父类关系是泛化,类与接口关系是实现
【包图】
包图属于静态建模方式,可视为类图的另一种表现方式
包是一种对元素进行分组的机制,如果系统非常复杂,常常包含大量的模型,为了利于理解以及将模型独立出来用于复用,对这些元素进行分组组织,从而作为一个个集合进行整体命名和处理
包中的元素需要与其它包或类中的元素进行交互,交互过程的可访问性包括:
- 公有访问(+):包中元素可以被其他包的元素访问
- 私有访问(-):包中元素只能被同属于一个包的内含元素访问
- 保护访问(#):包中的元素只能被此包或其继承包内的元素访 问
包的一些特征如下:
- 包是包含和管理模型内容的一般组织单元,任何模型元素都可以包含其中
- 一个模型元素只能存在于一个包中,包被撤销时,其中的元素也被撤销
- 包可以包含其他包,构成嵌套层次结构
- 包只是一个概念化的元素,不会被实例化,在软件运行中不会有包存在其中
【顺序图】
概述
顺序图属于动态建模机制,描述了一组对象的交互方式,它表示完成某项行为的对象和这些对象之间传递消息的时间顺序
顺序图由对象、生命线、控制焦点、消息等组成:
- 生命线:一条垂直的虚线,表示对象的存在时间
- 控制焦点:一个细长的矩形,表示对象执行一个操作所经历的时间段
- 消息:作用于控制焦点上的一条水平带箭头的实现,表示消息的传递
消息类别
消息是所有动态建模机制的核心,对象间的交互是通过消息传递的,常见类别有:
- 简单消息:没有描述通信的细节
- 同步消息:调用者发出消息后等待消息返 回后再继续执行
- 异步消息:调用者发出消息后不等待消息返回就继续执行
- 返回消息:代表从过程调用的返回
建模步骤
顺序图建模步骤为:
- 根据系统的用例或场景确定角色的工作流程
- 确定工作流程中涉及的对象,从左到右将对象放在顺序图上方,重要角色放置在左边
- 为每个对象画上生命线
- 为某一工作流程进行建模,使用各种消息将这些对象连接起来
【协作图】
协作图,属于动态建模机制,又称通信图、合作图,用于显示系统的动作协作,类似顺序图中的交互片段,但协作图也显示对象之间的上下文关系
实际建模中,顺序图和协作图的选择需要根据工作的目标而定,两者都显示对象之间的交互,如果重在时间或顺序,那么选择顺序图,如果重在上下文关系,那么选择协作图。
协作图显示多个对象及它们之间的关系,对象间的箭头显示消息的流向,消息上也可以附带标签,表示消息的其他信息,如发送顺序、显 示条件、迭代和返回值等
【状态图】
状态图,属于动态建模机制,由状态机扩展而来,用来描述对象对外部对象响应的历史状态序列,即描述对象所有可能的状态,以及哪些事件将导致状态的改变
此外,还可以描述对象在各个不同状态间的跳转以及这些跳转的外部触发事件,即从状态到状态的控制流
状态图侧重于描述某个对象的动态行为,是对象的生命周期模型,并不是所有的类都需要画状态图,有明确意义的状态、在不同状态下行为有所不同的类才需要画状态图。
创建状态图的步骤为:
- 标识出建模实体
- 标识出实体状态
- 创建相关事件和转换
【活动图】
活动图,属于动态建模机制,其中的活动是展示整个计算步骤的控制流及其操作数的结点和流的图,执行的步骤可以是并发的或顺序的
活动图可以看作特殊的状态图,用于对计算流程和工作建模,工作建模可视为对对象的状态建模
状态图着重描述对象的状态变化以及触发状态变化的事件,活动图着重描述各种活动的执行顺序。
活动图的开始结点和结束结点与状态图相同,活动图中的状态称为动作状态(活动),使用平滑的圆角矩形表示
动作状态之间使用箭头连接,表示动作迁移,箭头上可以附加警戒条件、发送子句和动作表达式
活动图是状态图的变形,根据对象状态的变化捕获动作和它们的结果,从而表示各动作及其间的关系
【构件图】
构件图,属于物理架构机制,其展现了一组构件的类型、内部结构和它们之间的依赖关系
构件图中的构件可以是源代码构件、二进制构件或者可执行构件,构件包含了其实现的一或多个逻辑类信息,因此也就创建了从逻辑视图到构件视图的映射
根据构件视图中构件之间的关系,可以轻易地看出当某一个构件发生变化时,哪些构件会受到影响
【部署图】
部署图,属于物理架构机制,描述了系统硬件和软件物理配置情况和系统体系结构,显示系统运行时刻的结构
一个系统模型只有一个部署图,可以显示计算节点的拓扑结构和通信路径、结点上运行的软构件等
部署图常常帮助理解分布式系统,一般由体系结构设计师、网络工 程师、系统工程师来描述
部署图里面主要的就是节点,节点就是存在于运行时并代表一项计算 资源的物理元素,一般至少拥有一些内存,而且通常具有处理能力
在 UML 中,节点用一个立方体来表示,节点名放在立方体的左上角,节点间的连线称为连接,表示系统之间进行交互的通信线路,通信类型用构造型表示,写在表示连接的线旁,以指定所用的通信协 议或网络类型