如何在UML类图中描述包含的映射?

如何在UML类图中描述包含的映射?,uml,class-diagram,Uml,Class Diagram,我有一个MyServer类,它包含一个映射,其键是MyClientType对象,其值是MyClient对象。我想在类图中描述这种关系,但我想不出一个干净的方法来实现这一点 MyServer | | | Map | | | | | MyC

我有一个MyServer类,它包含一个映射,其键是MyClientType对象,其值是MyClient对象。我想在类图中描述这种关系,但我想不出一个干净的方法来实现这一点

             MyServer
                 |
                 |
                 |
                Map
                 |
                | |
               |   |
  MyClientTypeKey   MyClientType
它不应该像上面那样非常简单吗

  • MyServer与映射有一对一的关联
  • 映射与键和值都有1到多个关联

我只需在MyClient端显示从MyServer到MyClient的多重数为0..*的关联。其他一切都是实现细节,可以留给程序员

           MyServer
               |
               |*
            T1toT2
            /    \
          1/      \1
         Key     Value
与Mark的解决方案不同的是,服务器与容器有很多关系。这也是为什么


您还可以加入一些更特定于UML的东西,比如指定键必须是唯一的(通过原型)。

首先,我和其他一些人认为,UML应该像在一些早期版本中一样包含一些基本的集合类型。他们可以采取的例子,从OCL


“EMF方式”似乎是正确的,但是它给了imho太多的to类型的重要性,而to类型实际上并不重要,所以我将它建模为一个关联类。这将使您能够捕获所有特定于地图的约束(例如多重性),这些约束可以使用常规类捕获,但不会使该类与其他类一样重要。

您可以使用限定关联:

┌──────────┐             1 ┌───────┐
│ MyServer │Key│───────────│ Value │
└──────────┘               └───────┘
请参阅:(因为使用ASCII很难绘制)

还请注意,限定关联会更改多重性:

┌──────────┐          0..* ┌───────┐
│ MyServer │───────────────│ Value │
└──────────┘               └───────┘

┌──────────┐             1 ┌───────┐
│ MyServer │Key│───────────│ Value │
└──────────┘               └───────┘

顶部显示了从服务器到0-n值的关联。相比之下,限定关联表示,任何给定的键都将只与一个值关联,并且不能让一个键有一个不存在的值。

Kru的答案是最好的,但它仍然只是提示一个映射

我认为这取决于图表所在的抽象级别。如果相对较高,我会选择黑猩猩的反应。如果它相对较低,并且您确实需要显示一个地图,故意显示与实现相关的细节,那么我将使用以下方法:

           MyServer
               |
               |
              Map                
               |
               |*
            T1toT2
            /    \
          1/      \1
         Key     Value
然后如何在代码中实现映射是完全不相关的(
T1toT2
运行时对象可能实际上并不存在)

正如Gabreil所提到的,这也可以使用关联类进行建模

           MyServer
               |
               |
              Map                
               |
               |*
            T1toT2
               |
               |
          1--------1
         Key     Value

当然,只有当你真的需要显示或指定一个地图时,这才是重要的。

这也是我想到的第一件事,但我觉得地图不配成为一个类。这只是一种遏制的方法。我不知道,只是感觉不对。但是,比方说,让key和type类与MyServer直接关联并不能说明它们是如何关联的。映射是一个容器,但也显示键和类型之间的关系。这是两个正确答案之一。另一个是@chimp的。如果MyServer被“扩展”以显示操作和属性,那么在MyServer的属性区中会有什么来建模映射关系呢?这是两个正确答案之一。另一个是@Kru。我之所以投票,完全是因为用户名是黑猩猩。。。不好名字,好回答。