我有一个 MyServer 类,其中包含一个 Map,其键是 MyClientType 对象,其值是 MyClient 对象。我想在类图中描述这种关系,但我想不出一个干净的方法来做到这一点。
6 回答
您可以使用合格的关联:
┌──────────┐ 1 ┌───────┐
│ MyServer │Key│───────────│ Value │
└──────────┘ └───────┘
请参阅:http ://etutorials.org/Programming/UML/Chapter+6.+Class+Diagrams+Advanced+Concepts/Qualified+Associations/ (因为使用 ASCII 很难绘制)
还要注意一个合格的关联会改变多重性:
┌──────────┐ 0..* ┌───────┐
│ MyServer │───────────────│ Value │
└──────────┘ └───────┘
┌──────────┐ 1 ┌───────┐
│ MyServer │Key│───────────│ Value │
└──────────┘ └───────┘
顶部说明了从服务器到 0-n 值的关联。相比之下,合格关联表示任何给定的键都只会与一个值相关联,并且您不能将键与缺失值相关联。
我只想在 MyClient 端显示从 MyServer 到 MyClient 的关联,多重性为 0..*。其他一切都是实现细节,可以留给程序员。
MyServer
|
|*
T1toT2
/ \
1/ \1
Key Value
与 Mark 的解决方案不同的是,服务器与容器具有多关系。这也是Eclipse 建模框架 (EMF) 建议实现 maps的方式。
您还可以添加一些更多特定于 UML 的内容,例如指定键必须是唯一的(通过构造型)。
首先,我和其他一些人认为,UML 应该包含一些基本的集合类型,就像它在一些早期版本中所做的那样。例如,可以从 OCL 中获取它们...
“EMF 方式”似乎是正确的,但是它对to类型赋予了太多的重要性,这真的是不重要的 imho,所以我将它建模为一个关联类。这将使您能够捕获可以使用常规类捕获的所有地图特定约束(例如多重性),但不会使该类与其他类一样重要。
MyServer
|
|
|
Map
|
| |
| |
MyClientTypeKey MyClientType
它不应该像上面那样简单吗?
- MyServer 与 Map 具有一对一的关联
- Map 与键和值都有一对多的关联。
克鲁的回答是最好的,但它仍然只暗示了一张地图。
我认为这取决于您的图表所在的抽象级别。如果它相对较高,我会选择黑猩猩的反应。如果它相对较低并且您确实需要显示地图,故意显示与实现相关的细节,我会选择以下内容:
MyServer
|
|
Map
|
|*
T1toT2
/ \
1/ \1
Key Value
然后如何在代码中实现映射完全无关紧要(T1toT2
运行时对象实际上可能不会出现)。
正如 Gabreil 所提到的,这也可以使用关联类来建模
MyServer
|
|
Map
|
|*
T1toT2
|
|
1--------1
Key Value
当然,只有当您确实需要显示或指定地图时才重要。