面向对象(Object-Oriented,OO)
面向对象基础
- 面向对象方法包括:面向对象设计、面向对象分析和面向对象实现。
- 三大特征:封装、继承、多态。
- 基础:抽象是面向对象的基础。
基本概念
抽象
抽象就是把事物的信息细节进行提炼、抽象,找到事物的本质和重要属性,以求简化、概括所观察到的现实世界。对象
在面向对象系统中,对象是基本的运行时的实体,既包括数据(属性),也包括作用于数据的操作(行为)。消息
对象之间进行通信的一种构造叫做消息。类
类是在对象之上的抽象,对象是类的具体化,是类的实例(Instance)
类可以分为三种:实体类、接口类(边界类)和控制类。
类之间存在一般和特殊关系。特殊类是一般类的子类。继承
继承是父类和子类之间共享数据和方法的机制。
一个父类可以有多个子类。单重继承:继承一个父类;多重继承:继承两个或更多父类。多态
不同对象收到同一消息可以产生完全不同的结果,这一现象称为多态(Polymorphism)。即同一行为,通过不同的子类,可以体现出来的不同的形态。
多态 = { 通用的 { 参数多态 − 方法的参数可以接受不同类型的对象,并根据实际传递的对象类型来执行不同的操作 包含多态 − 最常见的例子:子类型化,即一个类型是另一个类型的子类(子类型,不是子类)。 特定的 { 过载多态 − 同一个名字(操作符﹑函数名)在不同的上下文中有不同的类型。 强制多态 − 当需要将子类对象传递给接受父类对象的方法时,使用强制多态来实现多态的传递和对象的向上转型。 多态=\begin{cases} 通用的 {\begin{cases}参数多态 - 方法的参数可以接受不同类型的对象,并根据实际传递的对象类型来执行不同的操作 \\ \\ 包含多态 - 最常见的例子:子类型化,即一个类型是另一个类型的子类(子类型,不是子类)。 \end{cases}} \\ \\ 特定的 {\begin{cases}过载多态 - 同一个名字(操作符﹑函数名)在不同的上下文中有不同的类型。 \\ \\ 强制多态 - 当需要将子类对象传递给接受父类对象的方法时,使用强制多态来实现多态的传递和对象的向上转型。 \end{cases}}\end{cases} 多态=⎩ ⎨ ⎧通用的⎩ ⎨ ⎧参数多态−方法的参数可以接受不同类型的对象,并根据实际传递的对象类型来执行不同的操作包含多态−最常见的例子:子类型化,即一个类型是另一个类型的子类(子类型,不是子类)。特定的⎩ ⎨ ⎧过载多态−同一个名字(操作符﹑函数名)在不同的上下文中有不同的类型。强制多态−当需要将子类对象传递给接受父类对象的方法时,使用强制多态来实现多态的传递和对象的向上转型。动态绑定
动态绑定是多态性得以实现的重要因素。
- 静态类型:对象在声明时使用的类型,在编译期就已经确定。
- 动态类型:指针变量或引用变量所指向对象的类型,在运行期才能确定。
- 绑定:把一个方法与其所在的类/对象关联起来叫做方法的绑定。
- 静态绑定:绑定的是静态类型,发生在编译期。
- 动态绑定:绑定的是动态类型,发生在运行期。
面向对象分析(OOA)
- 面向对象分析基于用例模型。
- 包含5个活动:认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息。(建模系统功能,发现并确定业务对象,组织对象并确定其关系。)
面向对象设计(OOD)
OOD是将OOA所创建的分析模型转化为设计模型,设计各个对象、对象之间的关系(如层次关系、继承关系)和通信方式(如消息模式)等。主要作用是对OOA的结果进步一的规范化整理。
- 设计原则
- 单一责任原则(Single Responsibility Principle,SRP)。就一个类而言,应该仅有一个引起它变化的原因。
- 开放-封闭原则(Open & Close Principle,OCP)。软件实体(类、函数、模块等)应该是可以扩展的,即开放的;但是不可修改的 ,即封闭的。
- 里氏替换原则(LSP)。子类型必须能够替换掉它们的基类型。即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。当一个子类的实例应该能够替换任何其超类的实例时,它们之间才具有是一个(is-a)关系。
- 依赖倒置原则(DIP)。抽象不应该依赖于细节,细节应该依赖于抽象。即,高层模块不应该依赖于底层模块,二者都应该依赖于抽象。
- 接口分离原则(ISP)。不应该强迫客户依赖于它们不用的方法。
— 上述 1- 5 是面向对象方法中的五大原则 —- 重用发布等价原则(REP)。重用的粒度就是发布的粒度。
- 共同封闭原则(CCP)。包中的所有类对于同一性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包所有的类产生影响, 而对于其它的包不构成任何影响。
- 共同重用原则(CRP)。一个包中所有的类应该是共同重用的。如果重用了包中一个类,那么就要重用包中所有的类。
- 无环依赖原则(ADP)。在包的依赖关系图中不允许存在环。
- 稳定依赖原则(SDP)。朝着稳定的方向进行依赖。
- 稳定抽象原则(SAP)。包的抽象程度应该和其稳定程度一致。
ADP、SDP、SAP 是关于包之间的耦合性原则的,并且论述了评价系统中包结构优良与否的评判标准。
面向对象程序设计(OOP)
面向对象程序设计的实质是选用一种面向对象程序设计语言(OOPL),采用对象、类及其相关概念所进行的程序设计 。
- 面向对象测试
- 算法层。测试类中定义的每个方法,相当于传统软件测试中的单元测试。
- 类层。面向对象软件中类是基本模块,可认为是模块测试。
- 模板层。大体上相当于集成测试。
- 系统层。
UML
UML(Unified Modeling Language):统一建模语言。是面向对象软件的标准化建模语言。
OMT(Object Modeling Technique):面向对象建模技术 。
- 事物:是对模型种最具代表性的成分的抽象;
- 关系:把事物结合在一起;
- 图:聚集了相关的事物。
事物
UML 中有 4 种事物:结构事物、行为事物、分组事物和注释事物。
1. 结构事物
通常是模型的静态部分,描述概念或物理元素。包括:类(Class)、接口(Interface)、协作(Collaboration)、用例(Use Case)、主动类(Active Class)、构件(Component)、制品(Artifact)和结点(Node)。
2. 行为事物
是UML模型的动态部分。描述了跨越时间和空间的行为。包括:交互(Interaction)、状态机(State Machine)和活动(Activity)
3. 分组事物
是 UML 模型的组织部分,是一些有模型分解成的“盒子”。主要的分组事物是包(Package)。
4. 注释事物
是 UML 模型的解释部分。用来描述、说明和标注模型的任何元素。注解(Note)是一种主要的注释事物。
关系
UML 的关系:依赖、关联(聚合、组合)、泛化、实现。参考
各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
1. 依赖 (Dependency)
是两个事物间的
语义关系
,其中一个事物(独立事物)发生变化会影响另一个事物(依赖事物)的语义。
箭头指向:带箭头的虚线,指向被使用者。
依赖的变体有:精化、跟踪、包含和延伸。
2. 关联(Association)
关联是一种
结构关系
,它描述了一组链
,链是对象之间的连接。
箭头指向:带普通箭头的实线,指向被拥有者(双向的关联可以有两个箭头或没有箭头)。
3. 聚集(聚合)
是一种特殊类型的关联,它描述了整体和部分间的结构关系,且部分
可以离开整体而单独存在
。
箭头指向:带空心菱形的实心线,菱形指向整体。
4. 组合(Composition)
是整体与部分的关系,但
部分不可以离开整体而单独存在
。
箭头指向:带实心菱形的实线,菱形指向整体。
5. 泛化(Generalization)
是一种特殊/一般关系,特殊元素(子元素)的对象可替代一般元素(父元素)的对象。用这种方法,子元素共享了父元素的结构和行为。(其实就是继承关系)
箭头指向:带三角箭头的实线,箭头指向父类。
6. 实现(Realization)
实现是类元之间的
语义关系
,其中一个类元指定了由另一个类元保证执行的契约。
箭头指向:带三角箭头的虚线,箭头指向父类。
图
图(Diagram)是一组元素的图形表示,大多数情况下把图画成顶点(代表事物)和弧(代表关系)的连通图。
系统视图 | 说明 |
---|---|
逻辑视图 | 也称设计视图,表示设计模型中在架构方面具有重要意义的部分,即类、子系统、包和用例实现的子集。 |
进程视图 | 是可执行线程和进程作为活动类的建模,是逻辑视图的一次执行实例,描述了并发与同步结构。 |
实现视图 | 对组成基于系统的物理代码的文件和构件进行建模。 |
部署视图 | 把构件部署到一组物理节点上,表示软件到硬件的映射和分布结构 |
用例视图 | 最基本的需求分析模型 |
类型 | 图 |
---|---|
结构性视图 | (静态)类图、对象图、包图、组合结构图、构件图、部署图和制品图 |
行为性视图 | (动态) 用例图、顺序图(序列图)、通信图(协作图)、定时图(计时图)、状态图、活动图、交互概览图 |
交互图 | (动态) 顺序图(序列图)、通信图(协作图)、定时图(计时图)、交互概览图 |
1. 类图
是一切面向对象方法的核心建模工具。展现了一组对象、接口、协作
和它们之间的关系
。
- 通常包括:类,接口,协作。
- 关系:依赖、泛化、关联。
2. 对象图
对象图是实例(Instance)的表达
,包括对象和数据值。展现了某一时刻一组对象以及它们之间的关系,描述了在类图中所建立的事物的实例的静态快照。对象图一般包括对象和链。
3. 用例图
参考资料 展现了一组用例、参与者(Actor)以及它们之间的关系。通常包含以下内容:
- 用例(Use Case):对系统的用户需求(主要是功能需求)的描述,用例表达了系统的功能和所提供的服务(
动作
)。 - 参与者(Actor):是系统外部的一个实体(可以是任何事物或人)。
- 参与者、用例之间的关系:
- 包含关系:(用例之间)当可以用两个或以上的用例中提取公共行为时,应该使用包含关系表示它们。提取的公共用例称为抽象用例,原始用例称为基本用例。重要特征 :被抽象出来的用例是基础用例必须的部分,不能或缺。
- 扩展关系:(用例之间)若一个用例明显地混合了两种或以上的不同场景,即根据情况可能发生多种分支,则可将这个用例分为一个基本用例和一个或多个 扩展用例。重要特征:抽取的用例相对于基础用例来说不是必须的。
- 泛化关系:(用例之间,或参与者之间)当多个用例共同拥有一种类似的结构和行为的时候,可以将它们的共性抽象成为父用例,其它的用例组偶为泛化关系中的子用例。
- 关联关系:参与者与用例之间
4. 交互图(序列图,通信图,交互概览图,计时图)
用于对系统的动态方面进行建模。
-
序列图(顺序图)
是场景的图形化表示,描述了
以时间顺序
组织的对象之间的交互活动。- 序列图
有对象生命线
,是一条垂直的虚线 - 序列图
有控制焦点
,是一个瘦高的矩形,表示一个 对象执行一个动作所经历的时间段,即可以是直接执行,也可以是通过下级过程执行。
- 序列图
-
通信图(协作图)
强调收发消息的对象的结构组织。不但描述了对象之间的交互还描述了交互的对象之间的链接关系,即同事反映了系统的动态和静态特征。序列图和通信图是同构的,它们之间可以相互转换。 通信图有两个不同于序列图的特性:
- 通信图
有路径
,指出一个对象如何与另一个对象链接。 - 通信图有
顺序号
,表示一个消息的时间顺序。
- 通信图
-
交互概览图
活动图的变体,描述业务过程中控制流概览,软件过程中的详细逻辑概览,以及将多个图进行连接,抽象掉了消息和生命线。纯粹的交互概览图中所有的活动都是交互发生的。
-
计时图(定时图)
是一种新增的、
特别适合实时和嵌入式系统建模
的交互图,关注沿着线性时间轴、生命线内部和生命线之间的条件改变。它描述对象状态随着时间改变的情况,很想示波器。
5. 状态图
状态图展现了一个状态机,它由状态、转换、事件、和活动组成。
状态图专注于系统的动态视图,对于接口、类和协作的行为建模
尤为重要,强调对象行为的事件顺序。
- 通常包括:简单状态和组合状态、转换(事件和动作)。
6. 活动图
活动图是一种特殊的状态图,它展现了在系统内从一个活动到另一个活动的流程。
专注于系统动态视图,它对于系统的功能建模非常重要,并强调对象间的控制流程
。
一般包括:活动状态、动作状态、转换、对象。
两种使用活动图的方式:对工作流建模,对操作建模。
元素:并发(合并)分叉、并发汇合(合并分支)、流、分支、监护表达式
7. 构件图
构件图展现了一组构件之间的组织和依赖。
构件:系统中可替换的物理部分,它包装了实现且遵从并提供一组接口的实现。每个构件都提供特定的服务,必须被一个或多个实现所支持。
构件图由,组件、接口、实现、依赖组成。
8. 组合结构图
组合结构图用于描述一个分类器
(如类、构件或用例)的内部结构,分类器与系统其它组成部分之间的交互端口,展示一组相互协作的实例如何完成特定的任务,描述设计、架构模式或策略。
9. 部署图
部署图是用来对面向对象系统的物理方面建模
的方法,展现了运行时处理结点以及其中构件(物品)的配置。
10. 包图
包图是用于把模型本身组织成层次结构的通用机制,不能执行,展现有模型本身分解而成的组织单元以及其间的依赖关系。
- 一个元素只能被一个包所拥有
- 拥有关系的包形成了一个命名空间,其中同一种元素的名称必须唯一。
11. 制品图
描述计算机中一个系统的物理结构。制品图包括文件、数据库和类似的物理比特集合。制品图通常和部署图一起使用。