У меня есть класс MyServer, который содержит карту, ключи которой являются объектами MyClientType и значениями которых являются объекты MyClient. Я хотел бы изобразить это отношение в диаграмме классов, но я не могу понять, как это сделать.
Как описать содержащуюся карту в диаграмме классов UML?
Ответ 1
Вы можете использовать квалифицированную ассоциацию:
┌──────────┐ 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
Я бы просто показал связь с MyServer на MyClient с множеством 0.. * в конце MyClient. Все остальное - подробности реализации и может быть оставлено программисту.
Ответ 3
MyServer
|
|*
T1toT2
/ \
1/ \1
Key Value
Разница с решением Mark заключается в том, что сервер имеет много отношения к контейнерам. Это также, как Eclipse Modeling Framework (EMF) предлагает реализовать карты.
Вы также можете добавить еще некоторые UML-специфические вещи, например указать, что ключи должны быть уникальными (через стереотипы).
Ответ 4
MyServer
|
|
|
Map
|
| |
| |
MyClientTypeKey MyClientType
Если это не так просто, как указано выше?
- У MyServer есть один к одному с помощью Map
- Карта имеет от 1 до многих ассоциаций с ключами и значениями.
Ответ 5
Прежде всего, я и некоторые другие думают, что UML должен содержать некоторые базовые типы коллекций, как в некоторых более ранних версиях. Их можно взять, например, из OCL...
"Способ EMF" кажется правильным, однако это дает имхо слишком большое значение для типа, что действительно несущественно, поэтому я бы моделировал его как класс ассоциации. Это позволит вам фиксировать все специфические для карты ограничения (например, множественность), которые могут быть записаны с использованием обычного класса, но не сделает этот класс таким же важным, как другие.
Ответ 6
Ответ Kru - лучший, но он все еще только намекает на карту.
Я бы сказал, что это зависит от уровня абстракции, на котором сидит ваша диаграмма. Если бы он был относительно высоким, я бы пошел с ответом шимпанзе. Если он относительно низкий, и вам действительно нужно показать карту, преднамеренно отображающую детали, связанные с реализацией, я бы пошел со следующим:
MyServer
|
|
Map
|
|*
T1toT2
/ \
1/ \1
Key Value
То, как карта затем реализована в коде, совершенно не имеет значения (T1toT2
объекты времени выполнения на самом деле не могут быть).
Как уже упоминалось Gabreil, это можно было бы также смоделировать с использованием класса ассоциации
MyServer
|
|
Map
|
|*
T1toT2
|
|
1--------1
Key Value
Конечно, это только вопросы, если вам действительно нужно показать или указать карту.