《软件方法》最近在第8章做了一些调整,把识别关联的内容提到识别泛化之前,并增加了一些内容:
8.3.1.2 区分几个术语
在使用连接、关系、关联、链接等几个看起来很相似的术语时,要注意它们之间的区别:
(1)connection(连接)
普通用词,在UML中无特别含义。也就是说,connection是这几个里面最垫底的、最基础的。
(2)relationship(关系)
定义为:模型元素之间的连接。注意定义中的用词是“连接(connection)”,而不是“关联”(association),更不是“链接”(link),因为这些是在“关系(relationship)”之后定义的。
关系的含义很广,包括类的泛化、关联、依赖,用例的扩展、包含,包的依赖、导入等等。
(3)association(关联)
定义为:实例之间存在连接的类元(classifier)关系。
这里的类元不一定是类,当然,关联最常用来表示的就是类之间的关联。
(4)link(链接)
定义为:关联的实例。和对象是类的实例类似。
对比如图8-96:
图8-96 关联和链接(注意,左侧类图有多重性,右侧对象图没有多重性。)
8.3.2.2.2 多重性
首先要说一下Multiplicity(多重性)和Cardinality(基数)的区别。
多重性指关联端所允许的对象数量范围,如果数量大于1,还包括其有序性和唯一性。基数指某个关联实例中,关联端的具体对象数量。
也就是说,多重性规定了一个范围,基数必须在这个范围之内。显然,类图上出现的应该是多重性,讨论对象和链接时,才使用基数。
★《UML参考手册》中,cardinality词条只是简略地说了一句,而multiplicity有3页。
常用的多重性范围表示如图8-103。
图8-103 关联多重性表示
建模中我们往往更关注的范围的上限,所以一般情况下使用1(涵盖0..1和1..1)和*(涵盖0..*和1..*)就好,以免图上出现大量的0影响阅读。等到有足够的证据说明某个关联端必须清晰标出下限,再改为更严格的上下限形式。
对于多重性,建模人员容易出现的问题是把不同时间的链接快照合并成一个。
例如,男人和女人可以有“夫妻”关联,那“夫妻”关联的多重性是多少?中国是一夫一妻制度,按道理应该1对1,如图8-104上部。但有的建模人员会想,不对呀,有的人一生结好几次婚,那不是有几个配偶吗?是否应该如图8-104下部?
图8-104 “夫妻”关联的多重性
图8-104上部是正确的。在任何时间拍摄快照,拍到的应该是一个男人最多和一个女人有“夫妻”链接,不会拍摄到一个男人和多个女人存在“夫妻”链接,对女人来说,也是如此。
不过,拍摄快照确实可以拍到一个男人和多个女人存在“前夫妻”链接,如果要关注男人和女人的“前夫妻”关联,这个关联的多重性是多对多的,如图8-105。
图8-105 “前夫妻”的多重性
8.3.2.2.3 关联的方向