Имам клас 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“ изглежда правилен, но той придава imho твърде голямо значение на типа to, което наистина е маловажно imho, така че бих го моделирал просто като асоциативен клас. Това ще ви позволи да уловите всички специфични за картата ограничения (като например множество), които могат да бъдат заснети с помощта на обикновен клас, но няма да направи този клас толкова важен, колкото другите.
MyServer
|
|
|
Map
|
| |
| |
MyClientTypeKey MyClientType
Не трябва ли да е съвсем просто като по-горе?
- MyServer има асоциация едно към едно с картата
- Картата има от 1 до много асоциации както с ключовете, така и със стойностите.
Отговорът на Kru е най-добрият, но все още само загатва за карта.
Бих казал, че зависи от нивото на абстракция, на което се намира вашата диаграма. Ако е сравнително високо, бих приел отговора на шимпанзето. Ако е сравнително ниско и наистина трябва да покажете карта, умишлено показваща подробности, свързани с внедряването, бих избрал следното:
MyServer
|
|
Map
|
|*
T1toT2
/ \
1/ \1
Key Value
Начинът, по който картата след това се внедрява в кода, е напълно без значение (T1toT2
обектите по време на изпълнение може да не се появят в действителност).
Както спомена Габрейл, това може да се моделира и с помощта на асоциативен клас
MyServer
|
|
Map
|
|*
T1toT2
|
|
1--------1
Key Value
Разбира се, има значение само ако наистина наистина трябва да покажете или посочите карта.