Как да опиша съдържаща се карта в диаграма на 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
Това е един от двата верни отговора. Другото е на @chimp. - 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

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

Разликата с решението на Марк е, че сървърът има много отношение към контейнерите. Също така Eclipse Modeling Framework (EMF) предлага внедряване на карти.

Можете също така да добавите някои по-специфични за UML неща, като уточняване, че ключовете трябва да бъдат уникални (чрез стереотипи).

person Volker Stolz    schedule 31.01.2010

Първо, аз и някои други смятаме, че UML трябва да съдържа някои основни типове колекции, както беше в някои по-ранни версии. Могат да бъдат взети например от OCL...

„Начинът на EMF“ изглежда правилен, но той придава imho твърде голямо значение на типа to, което наистина е маловажно imho, така че бих го моделирал просто като асоциативен клас. Това ще ви позволи да уловите всички специфични за картата ограничения (като например множество), които могат да бъдат заснети с помощта на обикновен клас, но няма да направи този клас толкова важен, колкото другите.

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

Отговорът на Kru е най-добрият, но все още само загатва за карта.

Бих казал, че зависи от нивото на абстракция, на което се намира вашата диаграма. Ако е сравнително високо, бих приел отговора на шимпанзето. Ако е сравнително ниско и наистина трябва да покажете карта, умишлено показваща подробности, свързани с внедряването, бих избрал следното:

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

Начинът, по който картата след това се внедрява в кода, е напълно без значение (T1toT2 обектите по време на изпълнение може да не се появят в действителност).

Както спомена Габрейл, това може да се моделира и с помощта на асоциативен клас

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

Разбира се, има значение само ако наистина наистина трябва да покажете или посочите карта.

person Mike G    schedule 01.03.2012