Я не понимаю класс ассоциации - диаграмма классов UML - PullRequest
1 голос
/ 29 мая 2020

enter image description here

Кажется, я еще не совсем понимаю, как работает класс ассоциации, почему атрибуты класса роли не могут быть просто внутри класса человека?

в качестве примера:

Человек

  • имя
  • должность
  • описание

Ответы [ 2 ]

2 голосов
/ 30 мая 2020

почему атрибуты класса роли не могут быть просто внутри класса person?

обратите внимание на множественность 1..*, если вы переместите position и описание в Человек вы должны управлять их коллекцией и связывать каждого с соответствующей Компанией .

[из вашего примечания]

Для заданного Человек позиция и описание зависит от каждого связанного Compagny , поэтому невозможно иметь поля вы предлагаете, кроме случаев, когда позиция и описание являются коллекцией, и иметь способ / правило, чтобы узнать, какая запись в position и description соответствуют правому Compagny .

Перемещая также эту информацию в Person , вы удаляете симметрию, также можно переместить эту информацию в Compagny , с теми же примечаниями, что и для Person

Класс ассоциации - это и класс, и отношение, когда вы реализуете его на таком языке, как C ++ или Java et c, конечно, эта концепция не существует, поэтому один из способов - это как вы предлагаете переместить поля в один из двух классов или создать третий класс с ожидаемыми полями, больше одного на Человек и одно на Компания .

Преимущество третьего класса состоит в том, что вся связанная информация сгруппирована и имеет эквивалент:

enter image description here

Например, объект диаграмма может быть:

enter image description here

Без третьего класса вам нужно знать, как связать всю разделенную информацию, например, имея все в Person с использованием трех векторов для запоминания компании, должности и описания, вы можете использовать одно и то же значение индекса для всех, но это менее ясно, и когда вы добавляете / удаляете Company для Person вам необходимо обновить все эти векторы.

1 голос
/ 31 мая 2020

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

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

enter image description here

Then if you want in addition to capture position and description of the Person's role you use so called AssociationClass (Role in our case):

enter image description here

Each instance of Role has four properties (both an attribute and an end of an association are Properties in UML):

  1. Company
  2. Person
  3. position
  4. description

For example, suppose a person named Scott Tiger has roles in two companies - Food Inc and Water Ltd and each company knows that Scott Tiger has role in it. Then there will be two instances of Role (shown as tuples):

(Food Inc., Scott Tigger, eater, eats here)
(Water Inc., Scott Tigger, drinker, drinks here)

Now, returning to you question, it should be clear that an instance of Person with name, position, description attributes actually "lacks" Company and if you "add" an Company you will get Role, not Person!

So what you proposed in the end of your question is a valid design, if you model Company and Role and a person is just an attribute of Role:

enter image description here

It reads as follows: each instance of Company has zero or more Roles and each instance of Role has only one Company. Both ends of the association are navigable, i.e. Role knows its Company and Company knows its Roles.

UML Specification в пункте 9.5.3 дает вам следующий совет:

Свойство может представлять атрибут классификатора, memberEnd ассоциации, а в некоторых случаях и то и другое одновременно.

Полезное соглашение для общего сценария моделирования ios состоит в том, что Свойство, тип которого является разновидностью класса, является концом ассоциации, а свойство, чей тип Тип - это разновидность DataType - нет. Это соглашение не поддерживается UML.

...