Отношение ассоциации
Определение 11. Ассоциация (association) – семантическое отношение между двумя и более классами, которое специфицирует характер связи между соответствующими экземплярами этих классов.
Отношение ассоциации соответствует наличию произвольного отношения или взаимосвязи между классами. Данное отношение обозначается сплошной линией со стрелкой или без нее и с дополнительными символами, которые характеризуют специальные свойства ассоциации. В качестве дополнительных специальных символов могут использоваться имя ассоциации, символ навигации, а также имена и кратность классов-ролей ассоциации.
Имя ассоциации – необязательный элемент ее обозначения. Однако если оно задано, то записывается с заглавной буквы рядом с линией ассоциации. Обычно в качестве имени используется глагол или предложение, поясняющее причину возникновения связи. Отдельные классы ассоциации могут играть определенную роль в соответствующем отношении, на что явно указывает имя концевых точек ассоциации на диаграмме.
Наиболее простой случай данного отношения – бинарная ассоциация (binary association), которая служит для представления произвольного отношения между двумя классами. Она связывает в точности два различных класса и может быть ненаправленным (симметричным) или направленным отношением. Частный случай бинарной ассоциации – рефлексивная ассоциация, которая связывает класс с самим собой, т.е. один экземпляр класса обращается к другому экземпляру этого же класса. На рисунке 12 показано изображение рефлексивного отношения.
Рис. 12. Рефлексивная ассоциация.
Ненаправленная (двунаправленная) бинарная ассоциация изображается линией без стрелки. Для нее на диаграмме может быть указан порядок чтения классов с использованием значка в форме треугольника рядом с именем данной ассоциации.
В качестве простого примера ненаправленной бинарной ассоциации можно рассмотреть отношение между двумя классами – классом Компания и классом Сотрудник (рис. 13). Они связаны между собой бинарной ассоциацией, которая при движении от сотрудника к компании читается как Работает на, а при движении от компании к сотруднику – Использует труд. Имя ассоциации указано на рисунке рядом с линией, изображающей ассоциацию.
Рис. 13. Графическое изображение ненаправленной бинарной ассоциации между классами.
Если между классами создана двунаправленная связь, то каждый из них видит открытые атрибуты и операции друг друга.
Направленная (однонаправленная) бинарная ассоциация изображается сплошной линией с простой стрелкой на одной из ее концевых точек. Направление этой стрелки указывает на то, какой класс является первым, а какой – вторым.
В качестве простого примера направленной бинарной ассоциации можно рассмотреть отношение между двумя классами – классом Клиент и классом Счет (рис. 14). Они связаны между собой бинарной ассоциацией с именем Имеет, для которой определен порядок следования классов. Это означает, что конкретный объект класса Клиент всегда должен указываться первым при рассмотрении взаимосвязи с объектом класса Счет. Другими словами, эти объекты классов образуют кортеж элементов, например, <клиент, счет_1, счет_2,…, счет_n>.
Рис. 14. Графическое изображение направленной бинарной ассоциации между классами.
Если между классами установлена однонаправленная ассоциация, то в этом случае класс, от которого направлена стрелка, знает открытые атрибуты и операции второго класса, а второй класс, к которому идет стрелка, не видит атрибуты и операции первого класса. Например, класс Клиент знает тип и процентную ставку Счета, но Счет не знает имя и адрес Клиента (рис. 14). При таком отношении между классами Клиент должен знать о классе Счет и потому не может использоваться без него, но класс Счет не зависит от Клиента и может быть повторно использован самостоятельно, независимо от класса Клиент.
Частный случай отношения ассоциации – так называемая исключающая ассоциация (Xor-association). Семантика данной ассоциации указывает на то, что из нескольких потенциально возможных вариантов данной ассоциации в каждый момент времени может использоваться только один. На диаграмме классов исключающая ассоциация изображается пунктирной линией, соединяющей две и более ассоциации (рис. 15), рядом с которой записывается ограничение в форме строки текста в фигурных скобках: {xor}.
Рис. 15. Графическое изображение исключающей ассоциации между тремя классами.
Определение 12. N-арная ассоциация (n-ary association) – ассоциация между тремя и большим числом классов. (Тернарная ассоциация связывает отношением три класса.)
Графически n-арная ассоциация обозначается ромбом, от которого ведут линии к символам классов данной ассоциации. Сам же ромб соединяется с символами классов сплошными линиями. Обычно линии проводятся от вершин ромба или от середины его сторон. Имя n-арной ассоциации записывается рядом с ромбом соответствующей ассоциации. Однако порядок классов в n-арной ассоциации на диаграмме не фиксируется.
В качестве примера тернарной ассоциации можно рассмотреть отношение между тремя классами: Сотрудник, Компания и Проект. Данная ассоциация указывает на наличие отношения между этими тремя классами, которое может представлять информацию о проектах, реализуемых в компании, и о сотрудниках, участвующих в выполнении отдельных проектов (рис. 16).
Рис. 16. Графическое изображение тернарной ассоциации между тремя классами.
Класс может быть присоединен к линии ассоциации пунктирной линией. Это означает, что данный класс обеспечивает поддержку свойств соответствующей n-арной ассоциации, а сама n-арная ассоциация имеет атрибуты, операции и/или ассоциации. Другими словами, такая ассоциация является классом с соответствующим обозначением в виде прямоугольника и самостоятельным элементом языка UML – ассоциативным классом (Association Class).
Определение 13. Класс-ассоциация(association class) – модельный элемент, который одновременно является ассоциацией и классом. Ассоциация-класс может рассматриваться как ассоциация, которая обладает свойствами класса, или как класс, имеющий также свойства ассоциации.
В качестве примера можно рассмотреть ассоциацию Контракт между классами Разработчик и Компания. Перед началом трудовых отношений работник и работодатель подписывают между собой контракт, который имеет такие атрибуты, как, например, описание работ, сроки их выполнения и порядок оплаты (рис. 17).
Рис. 17. Представление ассоциации в виде класса с атрибутами.
Отдельный класс в ассоциации может играть определенную роль в данной ассоциации. Эта роль может быть явно указана на диаграмме классов. С этой целью в языке UML вводится в рассмотрение специальный элемент – концевая точка ассоциации или конец ассоциации (Association End), который графически соответствует точке соединения линии ассоциации с отдельным классом.
Конец ассоциации – часть ассоциации, но не класса. Каждая ассоциация может иметь два или больше концов ассоциации. Наиболее важные свойства ассоциации указываются на диаграмме рядом с этими элементами ассоциации и должны перемещаться вместе с ними. Одним из таких дополнительных обозначений является имя роли отдельного класса, входящего в ассоциацию.
Определение 14. Роль(role) – имеющее имя специфическое поведение некоторой сущности, рассматриваемой в определенном контексте.
Роль может бытьстатическойилидинамической.
Имя роли обычно представляет собой существительное, указанное рядом с концом ассоциации для соответствующего класса. Оно указывает на специфическую роль, которую играет класс, являющийся концом рассматриваемой ассоциации. Роль может быть указана для обоих классов, участвующих в связи, либо только для одного. На рисунке 18 в ассоциации, связывающей классы Разработчик и Компания, класс Разработчик играет роль работника, а класс Компания – роль работодателя. Имя роли не обязательный элемент обозначений и может отсутствовать на диаграмме.
Рис. 18. Указание роли класса при отношении ассоциации.
Следующий элемент обозначений – кратность ассоциации. Кратность относится к концам ассоциации и обозначается в виде интервала целых чисел, аналогично кратности атрибутов и операций классов, но без квадратных скобок. Этот интервал записывается рядом с концом соответствующей ассоциации и указывает допустимое количество объектов (экземпляров класса), участвующих в отношении. Кратность указывает, сколько экземпляров одного класса взаимодействуют с помощью отношения с одним экземпляром данного класса в данный момент.
Примеры индикаторов мощности:
0..1 – ноль или один;
1 – ровно один;
1..* – один или много;
2..5 – 2,3,4 или 5
6..8,10 – 6,7,8 или 10
Так, для примера на рис. 13 кратность "1" для класса Компания означает, что каждый сотрудник может работать только в одной компании. Кратность "1..*" для класса Сотрудник означает, что в каждой компании могут работать несколько сотрудников, общее число которых заранее неизвестно и ничем не ограничено. Вместо кратности "1..*" нельзя записать только символ "*", поскольку последний означает кратность "0..*". Для данного примера это означало бы, что отдельные компании могут совсем не иметь сотрудников в своем штате. Как видно из примера, читать кратность класса нужно на противоположном конце связи.
Указывать имя, роль или кратность связи необязательно. Это нужно делать, когда это может помочь более точному представлению модели системы и лучшему ее пониманию.
Ассоциация является наиболее общей формой отношения в языке UML. Все другие типы рассматриваемых отношений можно считать частным случаем данного отношения.