面向对象系统分析——类图
类图是面向对象建模的最重要的图。
一个类图应该注重表达系统静态结构的一个方面,并且要与抽象的层次相一致。
结构
1.结构是由种种转换规律组成的体系,结构就是由具有整体性的若干转换规律组成的一个有自身调整性质的体系。
2.结构的的三个特征
a) 整体性
i. 代数结构
ii. 类的类属性
iii. 面向对象系统的功能
b) 转换性
i. 具有转换规律和法则,如运算。
c) 自身调整性
i. 结构的守恒和封闭性,一个结构所固有的各种转换不会越出结构的边界之外。
3.母结构
a) 代数结构
i. 群 环 体 域
b) 序结构
i. 格
c) 拓扑结构
i. 邻接性 连续性 界限
ii. 图
一、对象和类
1.概念与表示法
a) 对象:是系统中用来描述客观事物的一个实体,是具有明确语义边界的实体;作为构成系统的一个基本单位,一个对象由一组属性和对这组属性进行操作的一组服务构成。
b) 类:是具有相同属性、服务、关系和语义的一组对象的集合,它为属于该类的全部对象提供了一个统一的抽象描述,其内部包括属性和服务两个主要部分。
c) 类和对象的关系——模板与实例;类的实例是对象。类的外延是其所产生的对象集。
d) 类的外延公理:两个类“相等”的充要条件是它们的元素完全相同,这就是说,类完全由其元素确定。类的所有元素可以通俗地称为它的外延。
e) 类的内涵:一个类的所有元素所共同具有的、而且是这个类的元素所独有的性质(也就是说不是该类的元素就不具有该性质)称为该类的内涵。
f) 类的内涵与外延之间存在着直观是“反比关系”:类的内涵越多。其外延越小;内涵越少,其外延越大。
g) 由一个类生成的一个对象可以扮演不同的角色。一个类的一个角色是在特定的语境下该类的对象所呈现的行为。
h) 主动对象(active object):是拥有线程或进程并能够启动控制活动的对象。是用于描述具有主动行为的事物。
i) 主动类:主动对象所属于的类叫做主动类。
j) 特征标记:服务的名称及其后的位于括号内的参数列表叫做特征标记(或基调)(signature)。
k) 类的各种表示法
2.识别对象与类的方法
a) 研究用户需求,明确系统责任
i. 阅读:阅读一切与用户需求有关的书面材料
ii. 交流:澄清疑点,指导需求
iii. 调查:到现场调查
iv. 记录、整理:产生需求文档(补充用况图)
b) 研究问题域
i. 亲临现场调查,掌握第一手资料
ii. 听取问题域专家的见解
iii. 阅读与问题域有关的材料
iv. 借鉴相同或类似问题域已有的系统开发经验及文档
c) 考虑系统边界
i. 参与者启发作为系统中的类的条件(管理信息、模拟行为、建立通讯)
d) 考虑系统责任
i. 对照系统责任所要求的每一项功能,查看是否可以由现有的对象完成这些功能。
ii. 如果发现某些功能在现有的任何对象中都不能提供,则可启发我们发现问题域中某些遗漏的对象。
e) 名词技术
i. 从名词到对象或类通常有一对一的映射。
ii. 用单个的专有名词或代词以及直接引用的名词识别对象。
iii. 用复数名词以及普通名词来识别类。
iv. 可以启发分析员发现对象的因素包括:人员、组织、物品、设备、事件、表格、日志、报告、结构等。
f) CRC卡片
i. 在一张CRC卡片上,记录类名并列出责任(提供那些服务)和协作者;
ii. 识别应该加入到已存在的CRC卡片集合中的尚未发现的类.寻找已存在的类中的责任和还没有指派给某个责任的协作者.
g) Booch对识别类的方法总结
i. 经典方法
ii. 行为分析
iii. 领域分析
iv. Use case 分析
v. CRC卡片
vi. 非正式英语
vii. 结构化分析
h) Peter Coad的四色类图
3.审查与筛选
a) 舍弃无用的对象
b) 精简对象
c) 与实现条件有关的对象,推迟到OOD考虑
d) 名词筛选技术
4.识别主动对象
a) 考虑问题域和系统责任
b) 从需求考虑系统的执行情况
c) 考虑系统边界
5.类的命名
a) 适合该类及其特殊类的全部对象实例
b) 反映个体而不是群体
c) 使用名词,避免无意义的符号
d) 使用问题域通用、规范的词汇
6.建立类图的对象层
a) 用类符号表示每个对象类
b) 填写类描述模板
c) 若发现新的属性与服务、关系,可以随时加到类符号中。
二、识别属性
1.概念与表示法
a) 实例属性:是类的一个已命名的性质,它描述该性质的一个实例可以取的值的范围。
i. 抽象为属性的性质是与问题域相关的。
ii. 从技术观点上,属性是一些变量(数据项或状态信息),包含它的每一个对象(实例)都具有自己的值。
iii. 按照面向对象方法的封装原则,一个对象的属性和服务是紧密结合的,对象的属性只能由这个对象的服务存取。
b) 类属性:是描述类的所有对象共同特征的一个数据项,对于任何对象实例,它的属性值都是相同的。
c) 通过在类范围属性名和类型表达式画下划线的方式表示类范围的属性。
d) 属性可具有初始值和可见性
2.属性的特征
a) 特征0:属性必须捕获与其对象所在的语义域相一致的特征。
b) 特征1:任何时间一个实例为其每一个属性都精确地给出一个值。
c) 特征2:不能包含内部的结构。
d) 特征3:属性必须是整个实体的特征。
e) 特征4:对象的属性必须与该对象相关。
f) 特征5:对象的属性值不能是与其有关的对象的值以其关系的值。
三、识别服务
1.概念与表示法
a) 操作:是类的行为特征,用于描述为了引发相关行为的名称、类型、参数与约束。
b) 服务:一个类为其他类所做的工作。一个对象的服务是当其他对象借助消息传递机制请求它时,它愿意执行的所公布的或公开的工作。
c) 方法:是操作的实现。当一个对象请求另一个对象的服务时对象完成的详细的动作集合(算法、过程)。
d) 类范围的操作用带下划线的名字和类型表达式串表示。实例范围的操作是默认的,对其不用标记。
e) 抽象操作带有标记“{abstract}”,或者把操作的特征标记写成斜体来表示它是抽象的。
2.识别服务
a) OOA不考虑算法简单服务
b) 考虑算法复杂的服务
c) 定义服务的策略与启发
i. 考虑系统责任
ii. 考虑问题域
iii. 分析对象状态
iv. 追踪服务的执行路线
v. 用动词识别服务。
vi. 识别出计算、监视和查询类的服务。
3.审查与调整
a) 审查对象的每个服务
b) 调整——取消无用的服务
i. 是不是高内聚的,一个服务只完成一项单一的、完整的功能
c) 调整——拆分或合并
4.认识对象的主动行为
a) 考虑问题域对象行为是被引发的,还是主动呈现的
b) 与参与者交互的对象服务
c) 完成最外层功能的对象服务外层与内层是请求与被请求的关系
d) 服务执行路线逆向追踪找到了主动服务就等于找到了主动对象。
5.服务的命名和定位
a) 命名:动词或动宾结构; 外向性
b) 定位:
i. 与实际事物一致
ii. 在泛化中的位置——适合类的全部对象实例
6.描述服务
a) 把每个对象的服务都填写到相应的类符号中。
i. 说明服务的职责。
ii. 服务原型(消息的格式)。
iii. 消息发送(指出在这个服务执行时,需要请求哪些别的对象服务,即接收消息的对象类名以及执行这个消息的服务名)。
iv. 约束条件:如果该服务的执行有前置条件、后置条件,以及执行时间的要求等其它需要说明的事项,则在这里加以说明。
v. 实现服务的方法(文字、活动图或流程图)。
四、定义关系
1.泛化
a) 定义
i. 如果类A具有类B的全部属性和全部操作,而且还具有自己特有的一些属性或操作,则A叫B的特殊类,B叫做A的一般类,A与B之间的关系成为泛化关系.
ii. 如果类A的全部对象都是类B的对象,且类B中存在不属于类A的对象,则A是B的特殊类,B是A的一般类,A与B之间的关系称为泛化关系.
b) 性质
i. 后代将具有祖先的所有的关联。
ii. 反对称性。
iii. 传递性。
c) 泛化集(GeneralizationSet):用来定义泛化关系中子集的集合。
d) 泛化集的约束
i. {complete, disjoint} 表明泛化集是覆盖的,并且某些特殊类没有共同的实例.
ii. {incomplete, disjoint} 表明泛化集不是覆盖的,并且某些特殊类没有共同的实例.
iii. {complete, overlapping} 表明泛化集是覆盖的,并且某些特殊类具有共同的实例.
iv. {incomplete, overlapping} 表明泛化集不是覆盖的,并且某些特殊类具有共同的实例.
e) 识别泛化
i. 学习当前领域的分类学知识
ii. 按常识考虑事物的分类
iii. 利用泛化的定义
iv. 看两个类的对象之间是否有“是一个”关系
v. 考察类的属性与服务
vi. 考虑领域范围内的复用
f) 一般-特殊结构的简化
i. 取消没有特殊性的特殊类
ii. 增加属性简化一般-特殊结构
iii. 取消用途单一的一般类,减少继承层次
g) 调整对象层和特征层
i. 定义泛化的活动,将使分析员对系统中的对象类及其特征有更深入的认识。在很多情况下,随着泛化的建立,需要对类图的对象层和特征层作某些修改,包括增加、删除、合并或分开某些类,以及增、删某些属性与服务或把它们移到其它类。
2.识别关联
a) 概念与表示法
i. 关联描述了引用类的实例的元组的集合。
ii. 两个类之间可以存在多个关联。
iii. 链是对象引用的元组。在最常见的情况下,它是一对对象引用。它是关联的一个实例。
b) 关联的类型
i. 关联类:具有关联和类的特征的建模元素。关联类既可以被看作是具有类的性质的关联,也可以被看作为具有关联性质的类。
ii. 限定关联:二元关联的属性或者属性列表,在此关联中,属性的值从整个对象集合里选择一个唯一的关联对象或者关联对象集。
iii. 异或关联
iv. 有序关联
v. 多元关联
vi. 聚合
c) 建立关联的策略
i. 认识对象之间的静态联系
ii. 认识关联的属性与操作
iii. 分析并表示实例连接的多重性
iv. 对多对多的关联的处理
l 用面向对象语言实现为两个数组指针
l 用关系数据库实现为多对多的表
v. 降低多对多关联的多重性
l 限定关联
l 引入新的中间类
3.聚合
a) 概念与表示法
i. 聚合(aggregation)是关联的一种特殊形式,表示整体和部分之间的“整体-部分”关系。
ii. 聚集(aggregate)是聚合关系中作为“整体”的类,而把作为“部分”的类称为成分或部分。
iii. 类与类之间的聚合关系指的是,一个类的对象实例,以另一个类的对象实例作为其组成部分,是种“a part of”或“has a”;也可理解为,一个类定义引用另一个类定义。
iv. 组合(Composition)是聚合的一种形式,其中,其部分和整体之间具有很强的“属于”关系,并且它们的生存期是一致的。这种聚集末端的多重性不能超过1。
v. 组合对象是组合类的实例。
b) 性质
i. 结构性质
l 部分必须与它们所构建的整体有某些结构上或功能上的关系。
ii. 数学性质
l 反对称性:如果对象A是对象B的一部分,那么对象B就不能是对象A的一部分。
l 传递性:如果对象A是对象B的一部分,对象B是对象C的一部分,那么对象A是对象C的一部分。
c) 分类
i. 整体部分关系的性质
l 构造性:整体部分之间存是否存在功能或结构上的关系
l 同质性:整体部分之间的类型是否相同
l 不变性:整体部分之间的是否不可分离性
d) 识别策略
i. 物理上的整体事物和它的组成部分
ii. 组织机构和它的下级组织及部门
iii. 团体(组织)与成员
iv. 一种事物在空间上包容其它事物
v. 抽象事物的整体与部分
vi. 具体事物和它的某个抽象方面
vii. 在材料上的组成关系
4.依赖
a) 一个依赖规约了两个或多个模型元素(或两个模型元素集合)之间的一种语义关系,对目标元素的改变可能需要改变该依赖中的源元素。
5.接口与实现
a) 接口定义为一个类的对外可见的一组操作的描述符,它定义了类对外提供的服务。
b) 接口是一种协约,处于使用者和实现者之间。