OpenU.Ru
Класс- ассоциация - это ассоциация, которая в
то же время является и классом. У класса-ассоциации
присутствуют как свойства класса, так и свойства ассоциации. Экземплярами
класса-ассоциации являются связи, у которых есть не только ссылки на объекты,
но и значения атрибутов. Несмотря на то что нотация класса-ассоциации состоит
из двух разных графических символов, на самом деле она изображает один элемент.
См. association; class.
Семантика
Класс-ассоциация обладает свойствами класса и свойствами ассоциации. Он связывает
два или несколько классов и вместе с тем имеет атрибуты и операции. Класс-ассоциация
используется в том случае, когда у каждой связи должны быть свои собственные
значения атрибутов, операции
или ссылки на объекты. Его можно рассматривать как класс,
у которого, кроме всего прочего, есть ссылка для каждого полюса ассоциации (это,
кстати, является самым стандартным и очевидным образом реализации класса-ассоциации).
Класс-ассоциация С, связанный с классами А и В, отличается от класса Д, имеющего
бинарную ассоциацию с классами А и В (см. подробнее раздел "Обсуждение"
данной статьи). Как и все связи, связь класса-ассоциации (в нашем примере класс
С) идентифицируется посредством ссылок на объекты, которые она связывает. При
этом значения атрибутов в процессе идентификации не используются. Исходя из
этого, две связи класса С не могут иметь одинаковую пару объектов (а, Ь), даже
если значения их атрибутов будут разными, так как их индивидуальность будет
совпадать. Другими словами, при наличии атрибута Е не допускается, чтобы связи
(a, b, e1) и (а, b, е2) были экземплярами С, так как у них одна и та же индивидуальность
(а, b). Объекты же имеют собственную врожденную индивидуальность, поэтому у
двух объектов могут совпадать значения атрибутов или связей. Иначе говоря, ассоциация,
в которую входит класс - ассоциация, является множеством кортежей и не имеет
дубликатов среди ссылок на объекты, тогда как неявное отношение (в нашем примере
класс Д) больше напоминает множество, допускающее дублирующие элементы (bag).
Более подробно эта тема освещена в разделе "Обсуждение" данной статьи.
Классы-ассоциации могут иметь операции, которые изменяют атрибуты связей, а
также позволяют добавлять или уничтожать дополнительные связи (кроме той, которая
описывается экземпляром объекта класса-ассоциации). Так как класс-ассоциация
является классом он сам может участвовать в различных ассоциациях.
Класс-ассоциация не может иметь ассоциацию сам с собой (хотя наверняка найдутся
и такие, которые увидят смысл и в такой рекурсивной конструкции).
Нотация
Класс-ассоциация изображается с помощью символа класса (прямоугольника), который
соединяется пунктирной линией с маршрутом ассоциации
(рис. 26).
Рис. 26. Класс-ассоциация
Имя в символе класса и строку с именем возле маршрута ассоциации можно опускать.
Маршрут ассоциации может иметь стандартные указатели на полюсах ассоциации.
В символе класса могут содержаться атрибуты и операции. Кроме этого, он может
участвовать в какой-либо другой ассоциации в качестве класса. Около пунктирной
линии нет никаких указателей, так как это не отношение, а часть единого символа
класса-ассоциации.
Стилистические указания
Место присоединения пунктирной линии к маршруту ассоциации должно находиться
на достаточном удалении от его полюсов и от имен ролей.
Не забывайте, что маршрут и класс-ассоциация являются единым элементом модели,
поэтому имеют одно общее имя. Это имя может указываться в символе класса, около
маршрута ассоциации или же и там, и там. Если у класса-ассоциации есть только
атрибуты, но нет операций или других ассоциаций, его имя может быть указано
у маршрута ассоциации, а не в символе класса. Это подчеркнет "ассоциативную
сторону" класса-ассоциации. Если же у него есть и операции, и другие ассоциации,
тогда уместнее подчеркнуть его "классовую" сторону, указав имя класса-ассоциации
в символе класса.
Обсуждение
На рис. 26 изображен класс-ассоциация, представляющий собой работу. "Работа"
(Job) - это отношение типа "многие ко многим". Человек (Person) может
иметь несколько мест работы, но только одно для данной конкретной компании (Company).
Зарплата (salary) не является атрибутом ни для компании, ни для человека, так
как ассоциация представляет собой отношение типа "множество-множество".
Таким образом, она будет атрибутом самой ассоциации.
Отношение начальник-подчиненный (boss-worker) - не просто отношения между двумя
людьми. Это отношение между человеком, выполняющим одну работу, и человеком,
выполняющим другую работу. Иными словами, это ассоциация (под названием Manages
(Управляет) между классом-ассоциацией и им самим.
Следующий пример демонстрирует разницу между классом-ассоциацией и конкретизированным
отношением, которое моделируется в виде класса. На рис. 27 владение акциями
(Stock) представлено в виде ассоциации между Person (Человек) и Company (Компания).
Атрибут класса-ассоциации quantity (количество) указывает на количество приобретенных
акций. Такое отношение можно изобразить с помощью класса-ассоциации, так как
здесь возможна только одна связь между парой Person-Company.
Рис. 27. Класс-ассоциация с атрибутом
При моделировании покупки акций (Purchase), как показано На рис. 28, класс-ассоциация
уже не требуется, так как может существовать несколько покупок для одной и той
же пары Person-Company. В то же время каждая из покупок отличается от другой,
так как у нее, кроме количества купленных акций, указывается время покупки и
стоимость. Такое отношение должно быть конкретизировано - иными словами, представлено
в виде отдельных объектов, обладающих собственной индивидуальностью. В данном
случае для такой цели подойдет обычный класс. Таким способом можно моделировать
отношение, которое является множеством с повторяющимися элементами (bag).
Рис. 28. Материализованная ассоциация