Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции комп мод.doc
Скачиваний:
23
Добавлен:
23.08.2019
Размер:
3.01 Mб
Скачать

7.2. Отношения

Отношения между классификаторами включают в себя ассоциацию, обобщение, реализацию и различные виды зависимостей, в том числе поток и использование (таблица № 3).

Таблица № 3

Типы отношений

Отношение

Функция

Нотация

А ссоциация (Association)

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

О бобщение (Generalization)

Отношение между общим описанием и более специфическими его разновидностями. Используется при наследовании.

Реализация (Realization)

Отношение между спецификацией и ее реализацией.

Зависимость (Dependency)

Отношение, существующее между двумя элементами модели.

Ассоциация представляет собой упорядоченный список из двух или более классификаторов с разрешенными повторениями. Наиболее часто встречается бинарная ассоциация, т.е. ассоциация между одной парой классификаторов.

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

С концептуальной точки зрения ассоциации отличаются от классов, к которым относятся. На практике они реализуются как указатели на задействованные в ассоциации классы. Каждая связь ассоциации с классом называется полюсом ассоциации. Полюса обладают именами (именами ролей), видимостью и множественностью. В общем случае множественность (кратность) указывает нижнюю и верхнюю границы количества объектов, которые могут участвовать в ассоциации. При этом символ «*» означает неограниченную множественность, «1» – единичное значение. Диапазон значений в общем случае задается в виде «n0..n1», где n0 - нижняя граница диапазона, а n1 – верхняя граница. На практике наиболее распространенным диапазоном является «0..1» (ноль или единица).

Таким образом, полюса ассоциации имеют различное значение, даже если находятся в пределах одного класса. Это свидетельствует о том, что ассоциация не симметрична (за исключением некоторых случаев), и ее полюса не взаимозаменяемы.

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

Данная нотация отражает ассоциативную связь между конкретной поездкой на транспорте («Поездка») и проездным билетом («Проездной билет») в условиях неограниченной множественности поездок (*) и приобретении новых проездных билетов по мере окончания срока действия предыдущих.

Рис. 5. Нотация для ассоциации

В случае, если ассоциация обладает собственными атрибутами, она является классом и носит название класс-ассоциации.

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

Рис. 6. Класс-ассоциация

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

Рис. 7. Квалифицированная ассоциация

Ассоциация, представляющая связь «часть – целое», называется агрегацией (aggregation). Схематически агрегация изображается в виде незакрашенного ромбика у класса-агрегата. Более сильная форма агрегации, при которой агрегат несет ответственность за создание и уничтожение своих частей, называется композицией (composition). Графически композиция изображается в виде закрашенного ромба у класса-агрегата.

Рис. 8. Агрегация (вверху) и композиция (внизу)

Обобщение (generalization) – это таксонометрический вид отношений (т.е. вид отношений в виде структурного дерева) между общим описанием и специфическим описанием, которое основывается на общем и детализирует его. Специфическое описание полностью согласуется с общим (оно имеет те же свойства, члены и отношения), но обладает также и некоторой дополнительной информацией. Общее описание называется прямым предком (parent), в транзитивном замыкании – предком (ancestor). Детализированный его вариант называется прямым потомком (child), а элемент в транзитивном замыкании – потомком (descendant).

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

На диаграммах обобщение изображается в виде стрелки с большим полым треугольником, идущей от прямого потомка к прямому предку. Несколько стрелок-обобщений можно объединить в одно дерево, так что стрелка будет указывать на прямого предка, а несколько ветвей – на прямых потомков.

Рис. 9. Нотация обобщения

Обобщение используется в целях:

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

  • организации полиморфных операций. Особенно удобен механизм обобщения при добавлении в существующую модель новых классов, так как при этом не нужно менять полиморфные вызовы. Когда полиморфная операция реализована не в классе-предке, а только в классах-потомках, она называется абстрактной и изображается на диаграммах курсивом;

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

Элемент-потомок наследует свойства своих предков. Но для классификаторов у потомка нельзя повторно объявлять тот атрибут, который уже объявлен у предка. В противном случае возникает конфликтная ситуация, и модель считается плохо согласованной. Операцию можно объявлять более чем в одном классификаторе, но при условии, что спецификации операции совместимы (одни и те же параметры, ограничения и возвращаемые значения). Метод может быть объявлен в нескольких иерархических классах. Причем метод, относящийся непосредственно к потомку, подменяет собой метод с той же сингатурой, унаследованный от предка. Если же класс наследует две различные копии метода (путем множественного наследования у разных классов), возникает конфликтная ситуация, и модель также считается плохо согласованной. Ограничения элементов также бывают индивидуальными и унаследованными от предков.

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

Рис. 10. Множественное наследование

Еще одной полезной концепцией UML, несмотря на то, что она не поддерживается многими языками программирования, является динамическая классификация. Статическая классификация предполагает, что с течением времени объект не может менять свой класс. Между тем во многих случаях объект способен приобретать или терять атрибуты и ассоциации в процессе своего функционирования. Если какой-то атрибут или ассоциация утеряны, информация о них утрачивается и не восстанавливается, даже если позже объект вернется к изначальному классу. Если же объект приобретает атрибуты или ассоциации, они должны быть инициированы точно так же, как инициируются новые объекты. Динамические классы носят название типов или ролей. Один из общих приемов моделирования для реализации динамической классификации требует, чтобы у каждого объекта был один статический неизменный класс, а также от нуля и более классов-ролей, которые могут появляться и исчезать с течением жизни объекта. Неизменяемые классы описывают фундаментальные, а классы-роли - изменяемые свойства объекта.

Реализация (realization) – это отношение, существующее между элементом модели, определяющим поведение, и элементом, который предоставляет программную реализацию этого поведения (например, интерфейс и реализующий его класс).

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

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

Рис. 11. Значки интерфейса и реализации

Зависимость (dependency) указывает на семантические отношения, существующие между двумя и более элементами модели. Зависимость описывает ситуацию, при которой изменения в независимом элементе (поставщике) требуют изменений в зависимом элементе (клиенте). Согласно такому определению, отношения ассоциации и обобщения также попадают в раздел зависимостей, однако у них есть своя специфическая семантика. Поэтому ассоциации и обобщения выделены в отдельные понятия, а зависимостями называются все прочие отношения (таблица № 4).

Таблица № 4

Виды зависимостей

Зависимость

Функция

Ключевое слово

Доступ (Access)

Пакет имеет доступ к содержимому другого пакета

«access»

Связывание (Binding)

Присваивание значений параметрам шаблона для создания нового элемента модели

«bind»

Вызов (Call)

Метод одного класса вызывает операцию другого класса

«call»

Вывод (Derivation)

Один экземпляр может быть вычислен на основе информации, предоставленной другим классом

«derive»

Дружественность (Friend)

Элемент имеет доступ к содержимому другого элемента, вне зависимости от его видимости

«friend»

Импорт (Import)

Пакет имеет доступ к содержимому другого пакета и добавляет имена из пространства имен этого пакета в пространство имен импортера

«import»

Создание экземпляра (Instantiation)

Метод одного класса создает экземпляры другого класса

«instantiate»

Параметр (Parameter)

Отношение между операцией и ее параметрами

«parameter»

Реализация (Realization)

Отношение между спецификацией и ее реализацией.

«realize»

Уточнение (Refinement)

Отношение между двумя версиями одной концепции на разных стадиях разработки модели или на разных уровнях абстракции. В конечной версии модели остается одна из концепций, так как обычно другие представляют собой менее проработанные версии. Отношение уточнения служит разработчику напоминанием, что все модели определенным образом соотносятся друг с другом.

«refine»

Отправка (Send)

Отношение между объектом, принимающим сигнал, и объектом, который этот сигнал отправляет

«send»

Трассировка (Trace)

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

«trace»

Использование (Usage)

Одному элементу для правильного функционирования необходимы услуги другого элемента (сюда входят вызов, конкретизация, параметр, отправка, другие зависимости) Часто отношение использования возникает при реализации. Например, компилятор может требовать наличия определения одного класса для компиляции другого.

«use»

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

Рис. 12. Зависимости