Связь (link) — любое семантическое отношение между некоторой сово­купностью объектов

Связь как элемент языка UML является экземпляром или примером произвольной ассоциации и может иметь место между двумя и более объ­ектами. Бинарная связь на диаграмме кооперации изображается отрезком сплошной линии, соединяющей два прямоугольника объектов (рис. 7.4). На концах этой линии дополнительно могут быть явно указаны имена ро­лей соответствующей ассоциации.

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

Примеры связей с различными стереотипами изображены на рис. 7.6. Здесь представлена обобщенная схема компании с именем с, которая со­стоит из департаментов (анонимный мультиобъект класса Департамент). В последние входят сотрудники (анонимный мультиобъект класса Сотрудник). Рефлексивная связь указывает на то, что руководитель департамента является одновременно и его сотрудником.

 

 

Рис.7.6. Графическое изображение связей с различными стереотипами

 

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

 

Сообщения и их графическое изображение

Сообщение (message) — спецификация передачи информации от одного элемента модели к другому с ожиданием выполнения определенных действий со стороны принимающего элемента.

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

 

 

Рис. 7.7. Графическое изображение различных типов сообщений на диаграмме кооперации

 

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

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

Сообщения в языке UML также специфицируют роли, которые иг­рают объекты — отправитель и получатель сообщения. Сообщения на ди­аграмме кооперации изображаются дополнительными стрелками рядом с соответствующей связью или ролью ассоциации. Направление стрелки указывает на получателя сообщения. Внешний вид стрелки сообщения имеет определенный смысл. На диаграммах кооперации может использо­ваться один из трех типов стрелок для обозначения сообщений (рис. 7.7).

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

• Сплошная линия с V-образной стрелкой (рис. 7.7, б) обозначает асинхронное сообщение в простом потоке управления. В этом случае клиент передает асинхронное сообщение и продолжает выпол­нять свою деятельность, не ожидая ответа от клиента.

• Пунктирная линия с V-образной стрелкой (рис. 7.7, в) обозначает
возврат из вызова процедуры. Стрелки этого типа зачастую отсутст­
вуют на диаграммах кооперации, поскольку неявно предполагается
их существование после окончания процесса выполнения операции
или деятельности.

Каждое сообщение может быть помечено строкой текста, которая имеет следующий формат:

Предшествующие сообщения> <Выражение последовательности <Возвращаемое значение := имя сообщения> <(Список аргументов)>

Предшествующие сообщения — это разделенные запятыми номера со­общений, записанные перед наклонной чертой:

<Номер сообщения','>* <*/'>. Если список номеров сообщений пуст, то вся запись, включая наклон­ную черту, опускается. Если номера сообщений указываются, то они должны соответствовать номерам других сообщений на этой же диаграмме коопера­ции. Смысл указания предшествующих сообщений заключается в том, что данное сообщение не может быть передано, пока не будут переданы своим адресатам все сообщения, номера которых записаны в данном списке.

Выражение последовательности — это разделенный точками список отдельных термов последовательностей, после которого записывается двоеточие: <Терм последовательности'.'..^':'

Каждый из термов представляет отдельный уровень процедурной вложенности в форме законченной итерации. Наиболее верхний уровень соответствует самому левому терму последовательности. Если все потоки управления параллельные, то вложенность отсутствует. Каждый терм по­следовательности имеет следующий синтаксис: [Целое число | Имя] [Рекуррентность].

• Целое число указывает на порядковый номер сообщения в проце­дурной последовательности верхнего уровня. Сообщения, номера которых отличаются на единицу, следуют подряд один за другим.

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

• Рекуррентность используется для указания итеративного или услов­ного характера выполнения передачи сообщений. Семантика рекур­рентности представляет ноль или больше сообщений, которые

должны быть выполнены в зависимости от записанного условия. Возможны два варианта записи рекуррентности:

'*"['Предложение-итерация']'для записи итеративного выполне­ния соответствующего выражения. Итерация представляет последо­вательность сообщений одного уровня вложенности. Предложение-итерация может быть опущено, если количество итераций никак не специфицируется. Наиболее часто предложение-итерация запи­сывается на псевдокоде или языке программирования. В языке UML формат записи этого предложения строгим образом не определен.

'['Предложение-условие']'для записи ветвления. Эта форма запи­си специфицирует условие для данного сообщения, передача кото­рого по данной ветви возможна только при его истинности.

В общем случае предложение-условие — обычное булевское выраже­ние и предназначено для синхронизации отдельных нитей потока управ­ления. Записывается в квадратных скобках и может быть опущено, если оно отсутствует у данного сообщения. Наличие этого условия обеспечи­вает передачу сообщения только в том случае, если это условие принима­ет значение «истина». Предложение-условие может быть записано на обычном тексте, псевдокоде или некотором языке программирования.

Предложение-условие записывается так же, как и итерация, но без звездочки. Это можно понимать как некоторую одношаговую итерацию. В общем случае предполагается, что специфицированная итерация вы­полняется последовательно. Если необходимо отметить возможность па­раллельного выполнения итерации, то для этой цели в языке UML ис­пользуется символ «*||». Итерация не распространяется на вложенные уровни данного потока или нити. Каждый уровень должен иметь собст­венное представление для итеративного повторения процедурной после­довательности.

Имя сообщения, записанное в сигнатуре после возвращаемого значе­ния, означает имя события, которое инициируется объектом-получателем сообщения после его приема. Наиболее часто таким событием является вы­зов операции у объекта-получателя. Это может быть реализовано различ­ными способами, один из которых — явное указание в качестве имени со­общения вызываемой операции. Тогда соответствующая операция должна быть определена в том классе, которому принадлежит объект-получатель.

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

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

В языке UML определены следующие стереотипы сообщений:

• <<call>> (вызвать) — сообщение, требующее вызова операции или процедуры объекта-получателя. Если сообщение с этим стереоти­пом рефлексивное, то оно инициирует локальный вызов операции у пославшего это сообщение объекта.

• <<return>> (возвратить) — сообщение, возвращающее значение вы­полненной операции или процедуры вызвавшему ее объекту. Значе­ние результата может инициировать ветвление потока управления.

• <<create>> (создать) — сообщение, требующее создания другого объекта для выполнения определенных действий. Созданный объект может стать активным (ему передается поток управления), а может остаться пассивным.

• <<destroy>> (уничтожить) — сообщение с явным требованием унич­тожить соответствующий объект. Посылается в том случае, когда необходимо прекратить нежелательные действия со стороны суще­ствующего в системе объекта, либо когда объект больше не нужен и должен освободить задействованные им системные ресурсы.

• <<send>> (послать) — обозначает посылку другому объекту сигнала, который асинхронно инициируется одним объектом и принимается (перехватывается) другим. Отличие сигнала от сообщения заключа­ется в том, что сигнал должен быть явно описан в том классе, объект которого инициирует его передачу.