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