Квалифицированные ассоциации

Классы ассоциаций

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

Ни рис. 15 acessPermission (разрешениеДоступа) является атрибутом AccessibleBy (Доступно). Данные в нижней части рисунка показывают возможные значения каждой связи. В UML класс ассоциации обозначается прямоугольником, прикрепленным к ассоциации пунктирной линией.

 

Рисунок 15 – Связи ассоциации, обладающие атрибутами

 

Основанием для введения классов ассоциаций послужила возможность создания ассоциаций типа многие-ко-многим. Атрибуты таких ассоциаций без всякиз сомнений являются принадлежностью связей и не могут быть приписаны ни к одному из объектов-участников. На рис. 15 атрибут acessPermission относится к файлу и пользователю одновременно и не может быть прикреплен только к одному из них без потери информации.

Ни рис. 16 показаны атрибуты двух ассоциаций типа один-ко-многим. Каждый человек, работающий на компанию, получает зарплату и занимает некоторую должность. Босс оценивает работу каждого сотрудника. Атрибуты могут присутствовать и в ассоциациях типа один-к-одному.

 

Рисунок 16 – Атрибуты в ассоциациях типа один-ко-многим

 

Ни рис. 17 показано, каким образом можно упаковать атрибуты ассоциации типа один-к-одному или один-ко-многим в класс, противоположный полюсу с кратностью «один». Для ассоциаций типа многие-ко-многим это сделать невозможно. Как правило, упаковывать атрибуты ассоциации в файл все же не рекомендуется, поскольку кратность ассоциации может измениться. Оба варианта, изображенных на рис. 17, допустимы для ассоциации типа один-ко-многим, однако только первая форма останется корректной, если кратность ассоциации WorksFor изменится на многие-ко-многим.

 

Рисунок 17 – Упаковка атрибутов ассоциации

 

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

Рисунок 18 – Класс ассоциации, участвующий в другой ассоциации

 

Не следует путать классы ассоциаций с ассоциациями, которые были выделены в отдельные классы. Разница демонстрируется на рис. 19. Класс ассоциации порождает один-единственный экземпляр для каждой пары экземпляров человека и компании. Напротив, экземпляров покупок (акций) между одним человеком

Рисунок 19

 

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

На рис. 20 демонстрируется наиболее типичный пример использования квалификатора для ассоциаций с кратностью один-ко-многим. Банк обслуживает множество счетов. Счет принадлежит одному единственному банку. В контексте банка уникальный счет определяется своим номером. Банк и Счет – это классы, а НомерСчет – квалификатор. Квалификация уменьшает эффективную кратность ассоциации до единицы.

Рисунок 20 – Квалифицированная ассоциация

 

Обе модели (квалифицированная и неквалифицированная) вполне корректны, но модель с квалифицированной ассоциацией сообщает дополнительную информацию. В квалифицированной модели добавляется ограничение на кратность: сочетание банка и номера счета дает не более одного счета. Квалифицированная модель также передает значение номера счета для прослеживания модели, что отражается в методах. Сначала следует найти банк, а затем указать номер счета, и в результате вы получаете нужный счет.

Для обозначения квалификатора используется небольшой прямоугольник, который пристыковывается к исходному классу около конца линии, обозначающей ассоциацию. Квалификатор может быть пристыкован к любой стороне прямоугольника исходного класса. Исходный класс вместе с квалификатором определяют целевой класс. На рис. 20 Bank и accountNumber вместе дают Account, а потому acountNumber указывается в прямоугольнике, пристыкованном к объекту Bank.

Другой пример применения квалификатора приведен на рис. 21. На бирже представлены многие компании. Однако каждая из них имеет свой собственный код ценных бумаг. Компания может присутствовать на разных биржах с разными кодами. (Мы предполагаем, что это утверждение истинно. Если бы на всех биржах система кодов была единой, мы бы сделали tickerSymbol атрибутом класса Company.)

 

Рисунок 21