如何在UML类图中描述一个包含的地图?

26

我有一个MyServer类,其中包含一个Map,其键是MyClientType对象,值为MyClient对象。 我想在类图中描述这种关系,但我找不到一种清晰的方法来实现。

6个回答

32

您可以使用限定关联:

┌──────────┐             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个值的关联。相比之下,限定关联表示任何给定的键只会与一个值相关联,而且你不能有一个键缺少值。


2
这是两个正确答案之一。另一个是@chimp的。 - Jim L.
如果将MyServer“扩展”以显示操作和属性,那么在MyServer的属性区域内放置什么来模拟映射关系? - Emile Cormier

11
我会将MyServer与MyClient的关联展示为MyClient端的0..*个多重性。其他所有内容均为实现细节,可以留给程序员处理。请注意保留原有的HTML标签。

这是两个正确答案之一。另一个是@Kru。 - Jim L.
我点赞仅仅是因为用户名是猩猩...并不是。这是个好名字,也是个好回答。 - JimLohse

3
           MyServer
               |
               |*
            T1toT2
            /    \
          1/      \1
         Key     Value

与马克的解决方案不同之处在于服务器与容器之间具有多关系。这也是Eclipse建模框架(EMF)建议实现映射的方式
您还可以添加一些更符合UML规范的内容,比如通过构造型来指定键必须是唯一的。

2

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

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


1
             MyServer
                 |
                 |
                 |
                Map
                 |
                | |
               |   |
  MyClientTypeKey   MyClientType

难道不应该像上面那样很简单吗?

  • MyServer与Map有一对一的关联
  • Map与键和值都有一对多的关联。

1
这也是我想到的第一件事,但感觉地图不应该成为一个类。它只是一种包含的方法。我不知道,感觉不太对。 - elifiner
但是,仅仅将键和类型类直接关联到MyServer上并不能展示它们之间的关系。Map是一个容器,同时也展示了键和类型之间的关系。 - Mark

1
Kru的回答是最好的,但它仍然只是暗示了一个Map。
我认为这取决于您的图表所处的抽象级别。如果它相对较高,我会选择猩猩的响应。如果它相对较低且您真的需要展示地图,有意地展示与实现相关的细节,那么我会选择以下内容:
           MyServer
               |
               |
              Map                
               |
               |*
            T1toT2
            /    \
          1/      \1
         Key     Value

地图在代码中的实现方式完全无关紧要(T1toT2 运行时对象可能实际上并不存在)。

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

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

当然,这只有在你真正需要展示或指定地图时才重要。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接