我有一个MyServer类,其中包含一个Map,其键是MyClientType对象,其值是MyClient对象。我想在类图中描绘这种关系,但我无法找到一种干净的方法来做到这一点。
答案 0 :(得分:27)
您可以使用合格的关联:
┌──────────┐ 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值的关联。相反,合格的关联表示任何给定的密钥只与一个值相关联,并且您不能使密钥缺少值。
答案 1 :(得分:11)
我只是在MyClient端显示MyServer与MyClient之间的关联,其多重性为0 .. *。其他所有内容都是实现细节,可以留给程序员。
答案 2 :(得分:3)
MyServer
|
|*
T1toT2
/ \
1/ \1
Key Value
Mark的解决方案的不同之处在于服务器与容器有很多关系。这也是Eclipse Modeling Framework (EMF) proposes to implement maps。
的方式您可能还会引入更多特定于UML的内容,例如指定键必须是唯一的(通过构造型)。
答案 3 :(得分:2)
首先,我和其他一些人认为,UML应该包含一些基本的集合类型,就像在早期版本中那样。例如,它们可以从OCL中获取......
“EMF方式”似乎是正确的,但它给了imho过于重要的到类型,这真的是不重要的imho,所以我只是作为一个关联类来模拟它。这将使您能够捕获所有可以使用常规类捕获的地图特定约束(例如,多重性),但不会使该类与其他类一样重要。
答案 4 :(得分:1)
MyServer
|
|
|
Map
|
| |
| |
MyClientTypeKey MyClientType
它不应该像上面那么简单吗?
答案 5 :(得分:1)
Kru的答案是最好的,但它仍然只是暗示地图。
我认为这取决于图表所处的抽象级别。如果它相对较高,我会选择黑猩猩的回应。如果它相对较低并且您确实需要显示地图,故意显示与实现相关的细节,我将使用以下内容:
MyServer
|
|
Map
|
|*
T1toT2
/ \
1/ \1
Key Value
然后如何在代码中实现映射完全无关紧要(T1toT2
运行时对象实际上可能不会实现。
如Gabreil所述,这也可以使用关联类
建模 MyServer
|
|
Map
|
|*
T1toT2
|
|
1--------1
Key Value
当然,只有当你真的 需要展示或指定地图时才有意义。