Как описать содержащуюся карту в диаграмме классов UML?

У меня есть класс MyServer, содержащий карту, ключи которой являются объектами MyClientType, а значения — объектами MyClient. Я хотел бы изобразить эту связь на диаграмме классов, но я не могу найти чистый способ сделать это.


person elifiner    schedule 28.07.2009    source источник


Ответы (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. Напротив, квалифицированная ассоциация говорит, что любой заданный ключ будет связан только с одним значением, и что у вас не может быть ключа без значения.

person Kru    schedule 10.04.2010
comment
Это один из двух правильных ответов. Другой принадлежит @шимпанзе. - person Jim L.; 04.03.2014
comment
Если бы MyServer был расширен для отображения операций и атрибутов, что было бы в разделе атрибутов MyServer для моделирования отношения карты? - person Emile Cormier; 26.08.2015

Я бы просто показал связь между MyServer и MyClient с кратностью 0..* на конце MyClient. Все остальное является деталями реализации и может быть предоставлено программисту.

person chimp    schedule 28.07.2009
comment
Это один из двух правильных ответов. Другой — @Kru. - person Jim L.; 04.03.2014
comment
Я проголосовал исключительно потому, что имя пользователя шимпанзе... нет. Красивое имя И хороший ответ. - person JimLohse; 17.01.2019


Прежде всего я и некоторые другие считают, что UML должен содержать некоторые базовые типы коллекций, как это было в некоторых более ранних версиях. Их можно взять, например, из OCL...

«Путь EMF» кажется правильным, однако он придает имхо слишком большое значение типу to, что на самом деле неважно имхо, поэтому я бы смоделировал его просто как класс ассоциации. Это позволит вам зафиксировать все специфические для карты ограничения (например, множественность), которые можно зафиксировать с помощью обычного класса, но не сделает этот класс таким же важным, как другие.

person Gabriel Ščerbák    schedule 06.04.2010

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

Разве это не должно быть довольно просто, как указано выше?

  • MyServer имеет связь один к одному с картой
  • Карта имеет от 1 до многих ассоциаций как с ключами, так и со значениями.
person Mark    schedule 28.07.2009
comment
Это первое, что пришло мне в голову, но мне кажется, что карта не заслуживает того, чтобы быть классом. Это просто метод сдерживания. Я не знаю, просто не чувствую себя хорошо. - person elifiner; 28.07.2009
comment
Но тогда просто, скажем, наличие классов ключа и типа, непосредственно связанных с MyServer, не показывает, как они связаны. Карта представляет собой контейнер, но также показывает взаимосвязь между ключом и типом. - person Mark; 28.07.2009

Ответ Кру - лучший, но он все еще только намекает на Карту.

Я бы сказал, что это зависит от уровня абстракции, на котором находится ваша диаграмма. Если он относительно высок, я бы выбрал реакцию шимпанзе. Если это относительно низко, и вам действительно нужно показать карту, намеренно показывая детали, связанные с реализацией, я бы пошел со следующим:

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

То, как карта затем реализуется в коде, совершенно не имеет значения (объекты T1toT2 времени выполнения могут фактически не возникать).

Как упоминал Габреил, это также можно было бы смоделировать с использованием класса ассоциации.

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

Конечно, это имеет значение только в том случае, если вам действительно действительно нужно показать или указать карту.

person Mike G    schedule 01.03.2012