类模型可以用来描述系统内部对象的特征,对象之间的相互关系,捕获系统的静态特征。
对象:具有标识的一个概念或者事物,是类的一个实例。
类:描述了具有相同特性(属性)和行为(操作)的对象的结合。
类图:一个方框,黑体字表示类名,名字放在中央,大写首字母,我们一般用单数名词来表示类。
对象图:方框后面跟冒号和类名
链接(link): 对象之间物理上或者概念上之间的连接
关联(association):描述有共同语义和结构的一组链接。如一个人为一家公司工作(WorksFor),这里WorksFor就是一个关联。一个关联的链接连接同一个类的多个对象,如同类描述了一组潜在的对象一样。在问题陈述中,经常以动词的形式出现。
自关联(self-association):同一个类对象之间的关联
多重性(multiplicity):一个类与关联(类)单个实例可能关联的数目。
关联在
本质上是双向的,二元关联的名称通常需要按照特定的方向阅读,但二元关联可以在任意一个方向上遍历。例如:WorksFor将某人连接到公司,WorksFor相反应该是Employs,它将公司连接到某人。事实上,两个方向的遍历都是由意义的,只是
关联的名称建立了方向而已。
通过关联终端名可以统一对同一个类的多重引用。在UML创建类图的时候,因该正确
使用关联终端的名称,不因该为每一个引用引入一个独立的类。
开发者实现的时候,常常把关联实现为一个对象到另一个对象的引用。从建模的角度来看,将关联实现为引用完全可以接受,
但不因该这样对关联来建模。
链接是对象之间的一种关系,将链接建模为引用掩盖了这样的事实,链接本身并不是两边对象的一部分,虽然它需要同时依赖于两边的对象。
关联类(association class)
:既是一个关联也是一个类。
UML的表述法是:通过虚线连接依附于关联的一个类方框。
限定关联(qualified association):是这样的一种关联,其中被称为限定符得属性,可以显出关联“多”端对象上的歧义。
排序:
关联端上的“多”方对象通常没有明确的顺序,并且可以把它们看成结合。UML表述过程中可以在关联端旁标注{ordered}来表示一个有序的对象结合(不允许有重复值) 。
包,序列:
{bag}:允许有重复值的元素结合。
{sequence}: 允许有重复值的元素结合
泛化(generalization):
指类(superclass)与其一个或多个类(subclass)之间的关系。泛化利用类的相似性和差异性来组织类, 同时描述对象的结构。泛化经常被称作是”is-a”的关系(子类的实例也使父类的实例)。
UML表示法:大的中空箭头,指向父类
泛化一般可以通过OOP语言的继承机制来实现,泛化的主要的用途:
1. 支持多态性
2. 结构化的描述对象(根据对象的相似性和区别性来组织对象,形成分类)
3. 支持代码复用
类建模的一些技巧:
- 范围:
开始建模的时候,不要只是草草的记下类,关联,继承。首先需要先理解要解决的问题,依靠问题的答案驱动模型的内容。模型仅表表示问题的相关方面,你需要考虑需要那些对象,忽略那些对象。
- 简洁:
努力保持模型的简洁性,尽量保证类的数目最少
- 布局:
努力保持图布局的对称性
- 名称:
仔细选择名称(可以起到强大的注释功能)
- 引用:
不要将对象引用作为属性在对象里使用,相反,我们把它们建模成关联。(目的是:建模是捕获真实意图,而不是一种实现方式)
- 多重性:
努力保持关联终端的多重性为“1”。
- 关联终端名:
使用关联终端名来统一同一个类的引用
- 包,序列:
可以通过在关联终端注解为:{bag},{sequence}支持一对 对象的多重链接。
- 关联的属性:
分析过程中,不要将关联的属性折进某一个关联的类中。
- 限定关联:
要挑战关联终端多重性中的“多”,使用限定关联
- 泛化层次:
避免泛化层次过深。
- 评审:
让团队中的其他人评审你的模型
- 文档:
要不断的归档模型。图确定了模型的结构,但不能清楚地描述原理。书面的解释会引导读者,并解释模型以某种方式构建的微妙原因。