OpenU.Ru
Передача информации от одного объекта (или другого экземпляра) другому, в расчете
на то, что за этим последует некоторая деятельность. Сообщением может быть сигнал
или вызов операции. Получение сообщения, как правило, трактуется как экземпляр
события.
См. call; collaboration;
interaction; operation;
send; signal.
Семантика
Сообщение представляет собой отправку сигнала одним объектом (отправителем)
другому или другим объектам (получателям). Оно может также быть вызовом операции
объекта (получателя), который осуществляет другой объект (отправитель). Реализуется
сообщение различными способами - как вызов процедуры, межпроцессное взаимодействие
между активными потоками, явное создание событий и т. д. С точки зрения логики,
отправка сигнала и вызов операции очень похожи. И в том и в другом случае между
отправителем и получателем возникает коммуникация, в процессе которой передается
информация, определяющая дальнейшие действия получателя. Вызов может считаться
образцом сигнала, имеющего при отправке неявный аргумент указателя возврата
(который затем используется для отправки обратного сигнала). Вызов можно моделировать
с помощью двух сообщений - сообщения вызова и возвращаемого сообщения. На уровне
реализации сигналы и вызовы имеют различные свойства и поведение, поэтому в
языке UML их принято считать различными элементами.
Полученный сигнал может запустить переход в конечном автомате получателя. Получатель
может обрабатывать вызов двумя различными способами, (выбор осуществляется в
модели получателя). Операцию можно реализовать как тело процедуры (метод), вызываемое
в момент получения вызова. По завершении выполнения этой процедуры управление
возвращается к объекту, пославшему вызов (вместе с возвращаемым значением, если
таковое имеется). С другой стороны, если объект активен, то вызов операции может
привести к событию вызова, который запустит переход в конечном автомате. В этом
случае метод оказывается пустым, зато переходу могут приписываться действия.
Этот же переход может также предоставлять объекту-отправителю возвращаемое значение.
После окончания перехода (а если событие вызова не запускает переход, то немедленно)
управление возвращается к объекту, отправившему вызов.
В сообщение входит выражение для множества целевых объектов. Сообщение отправляется
каждому из объектов этого множества. Если порядок отправки не оговорен особо
(при помощи ограничения), то сообщения отправляются одновременно всем объектам,
Эго указывает на совершенно произвольный порядок их выполнения (который может
быть и параллельным). Если сообщения должны быть отправлены в определенном порядке,
то их следует посылать в цикле. В случае вызова управление возвращается к отправителю
после того, как завершились все вызовы.
Опциональное время отправки пли приема сообщения должно указываться около его
имени.
См. timing mark.
Структура
У сообщения есть отправитель, получатель и действие.
Во взаимодействии отправителем является роль классификатора, которая отправляет
сообщение, а получателем - роль классификатора, которая получает сообщение.
Действие представляет собой вызов, сигнал, локальную операцию или же примитивное
действие, такое как создание или уничтожение, В действие входит список аргументов,
выражение для множества получателей и ссылка на соответствующую операцию или
сигнал, В действии может также находиться указание на обусловленность и повтор
выполнения сообщения.
Во взаимодействии сообщения связаны отношениями предшественник-последователь
и вызывающий-вызываемый. Второе применяется к процедурным методам. Каждые вызов
добавляет в последовательность новый уровень вложенности. В рамках вызова сообщения
располагаются последовательно, однако при этом сохраняется возможность параллельных
подпоследовательностей.
Отношения предшественник-последователь (установление последовательности) служат
для формирования линейной последовательности сообщений. У каждого сообщения
может быть несколько предшественников и несколько последователей. Если у двух
разных сообщений есть общий предок и при этом не указано никаких правил для
последовательности, то они могут выполняться параллельно. Если у сообщения есть
несколько предшественников, то оно должно дождаться их завершения. Такое сообщение
представляет собой точку синхронизации.
Отношения вызывающий-вызываемый (активизатор) служат для определения структуры
вложенной процедуры. Сообщение, которое вызывает процедуру (используя для этого
действие вылова), является активизатором всех сообщений, составляющих тело этой
процедуры. Между собой вызываемые сообщения связаны отношением предшественник-последователь,
которое определяет их относительный порядок (и допускает параллелизм).
Если сообщение представляет собой вызов, то отправитель блокируется до тех пор,
пока вызываемая процедура не закончится и не вернет управление. Если получатель
обрабатывает операцию как событие вызова, то возвращение процедуры осуществляется
после завершения начального перехода, а уже затем управление передается объекту-отправителю,
а объект-получатель может продолжать свое собственное выполнение.
Отношения установления последовательности и активизации связывают сообщения,
находящиеся строго внутри одного и того же взаимодействия.
Нотация
Нотация сообщений для диаграмм последовательности отличается от нотации для диаграмм кооперации.
Диаграммы последовательности
На диаграммах последовательности сообщение изображается в виде непрерывной
стрелки, идущей от линии жизни одного объекта (отправителя) к линии жизни другого
объекта (целевого). Если стрелка перпендикулярна линиям жизни, то считается,
что сообщение передается мгновенно или, по крайней мере, быстро по сравнению
с внешними сообщениями. Если же стрелка скошена, это значит, что передача сообщения
занимает некоторый промежуток времени, в течение которого могут отправляться
другие сообщения. Когда объект отправляет сообщение самому себе, стрелка начинается
и заканчивается у одной и той же линии жизни. Стрелки сообщений вертикально
упорядочены (сверху вниз). Если два сообщения параллельны, то порядок их расположения
не имеет значения. Сообщения могут быть пронумерованы, однако чаще всего нумерация
не указывается, поскольку их порядок изображается достаточно наглядно.
Отсрочка передачи. Чаще всего стрелки сообщений располагаются горизонтально,
что указывает на атомарность процесса их отправки. Другими словами, по сравнению
с протяженностью взаимодействия это время совсем незначительно, и за время передачи
сообщения "произойти" ничего не может. Это утверждение справедливо
для многих компьютеров.
Если же для передачи сообщения требуется некоторое количество времени, за которое
может произойти что-то еще (например, отправка сообщения в обратном направлении),
то стрелка изображается с наклоном вниз.
Разветвление. Разветвление изображается при помощи нескольких стрелок, которые
выходят из одной точки. У каждой из них должно быть указано сторожевое условие.
Такая конструкция может представлять собой как обусловленность, так и параллелизм
- в зависимости от того, являются ли сторожевые условия взаимоисключающими или
нет.
Итерация. Некое множество сообщений можно выделить и обозначить как повторяющееся.
Значок итерации указывает на то, что все множество этих сообщений может осуществляться
несколько раз. Для процедуры можно указать условие продолжения итерации (под
итерацией). В случае параллелизма одни сообщения, изображенные на диаграмме,
являются частью итерации, а другие выполняются всего один раз.
Диаграммы кооперации
На диаграмме кооперации сообщение изображается в виде маленькой стрелки с пометкой. Эта стрелка прикрепляется к маршруту, идущему от объекта-отправителя к объекту-получателю, который используется для осуществления доступа к целевому объекту. Наконечник стрелки указывает вдоль маршрута, в направлении целевого объекта. Если же объект шлет сообщение самому себе, то оно изображается в виде маршрута, идущему в виде петли к этому же объекту. У конца стрелки ставится ключевое слово "self". К одной связи может прикрепляться несколько сообщений, идущих в одном или в различных направлениях. На относительный порядок сообщений указывает номер, стоящий в метке сообщения.
Обе диаграммы
У сообщения есть метка, в которой указываются имя сообщения (имя операции или
сигнала) и значения аргументов. У стрелки может также быть порядковый номер,
который показывает очередность этого сообщения в течение всего взаимодействия.
На диаграммах последовательности номер сообщения можно не указывать, так как
последовательность сообщений на них задастся наглядно. Однако на диаграммах
кооперации без них уже не обойтись. Впрочем, номера удобно использовать на обоих
видах диаграмм для обозначения параллельных потоков управления. У сообщения
может быть сторожевое условие.
Тип потока управления. Для обозначения различных потоков управления используются
следующие виды наконечников стрелок-сообщений:
Непрерывная линия,
закрашенный
наконечник
Вызов процедуры или другой вложенный поток управления. Вся вложенная последовательность
должна завершиться до того, как возобновится вызывающая последовательность.
Может использоваться с обычным вызовом и процедур, а также с параллельно активными
объектами (когда один из них отправляет сигнал, а потом ждет завершения вложенной
последовательности).
Непрерывная линия,
не закрашенный
наконечник
Плоский поток управления. Каждая такая стрелка показывает продвижение к следующему
шагу последовательности. При наличии вложенных процедур, соответствует обходу
листьев дерева действий в прямой прошивке1 дерева.
Непрерывная линия,
половинка наконечника
Асинхронный поток управления. Используется вместо стрелки с тонким наконечником,
когда нужно явно показать асинхронность сообщения.
Пунктирная линия,
не закрашенный
наконечник
Возврат из вызова процедуры. Если возврат неявно подразумевается, возвратную
стрелку можно не указывать.
Прочие варианты
Стрелки могут указывать и на другие виды потоков управления, например, неприсоединение
к очереди (balking) или перерыв (time-out). Они относятся к расширениям базового
языка UML.
Метка сообщения. Метка сообщения имеет следующий синтаксис:
предшественникнебязсторожевое-условиенеобяз выражение-последовательностинеобяз
список-возвращаемых-значений := необяз имя-сообщения ( аргументсписок, )
Метка указывает на отправляемое сообщение, его аргументы и возвращаемые значения,
а также на очередность этого сообщения в общем, взаимодействии, включая вложенные
выводы, итерации, разветвление, параллелизм и синхронизацию.
Предшественник. На диаграммах кооперации предшественник представляет собой список
из порядковых номеров, за которыми следует наклонная черта ( / ).
порядковый-номерсписок, /
Если список пустой, то это выражение опускается.
Каждый порядковый номер представляет собой выражение последовательности без
использования рекуррентности, которое должно соответствовать порядковому номеру
другого сообщения.
Смысл этого состоит в том, что поток сообщений не может запуститься до тех пор,
пока не осуществятся все потоки сообщений, чьи порядковые номера перечислены
в списке (даже если поток оставит позади требуемый поток сообщений, сторожевое
условие все равно останется истинным). Таким образом, сторожевое условие представляет
собой синхронизацию потоков.
Следует отметить, что сообщение, соответствующее предыдущему порядковому номеру
текущего сообщения, является его неявным предшественником, поэтому его можно
не указывать в списке. Порядковые номера с одинаковым префиксом образуют последовательность.
Числовым предшественником является тот, у которого последний, элемент номера
на единицу меньше. Номер 3.1.4.5 является предшественником номера 3.1.4.6.
На диаграмме последовательности сама последовательность определяется визуальным
упорядочиванием. На синхронизацию указывает наличие нескольких сообщений, идущих
к одному и тому же объекту, еще до того, как он начнет отправлять свои собственные
сообщения.
Выражение последовательности. Выражение последовательности является списком
элементов последовательности, разделенных точками. После списка ставится двоеточие.
Каждый элемент списка представляет собой уровень вложенности процедуры в общем,
взаимодействии. Если все управление параллельно, то вложения не происходит.
Каждый элемент последовательности имеет следующий синтаксис:
метка рекуррентностьнеобяз
где метка это
целое число
или
имя
Целое число представляет очередность сообщения на следующем, более высоком уровне
вызова процедуры. Сообщения, отличающиеся друг от друга только по целому числу,
связаны между собой на одном уровне вложенности. Например, сообщение 3.1.4 следует
за сообщением 3.1.3 в активации 3.1.
Имя изображает параллельный поток управления. Сообщения, отличающиеся друг от
друга по последнему фрагменту имени, параллельны на соответствующем уровне вложенности.
Например, сообщение 3.1а и сообщение 3.1b параллельны в активации 3.1. Все потоки
управления на данном уровне вложенности равны между собой.
Рекуррентность указывает на обусловленное или повторное выполнение. В зависимости
от условий, она представляет собой от нуля и более выполняемых сообщений. Существуют
следующие ее варианты:
* [ выражение итерации] итерация
[ выражение условия ] разветвление
Итерация указывает на повторяемость сообщений на определенной глубине вложенности.
Строку выражение итерации можно опустить (в этом случае условия итерации не
определены). Эта строка предназначена для выражения в псевдокоде или реальном
языке программирования, так как UML не определяет ее формат. Например:
*[i := l..n]
Условие представляет собой сообщение, выполнение которого зависит от истинности
выражения условия. Строка выражение условия предназначена для выражения в псевдокоде
или реальном языке программирования, так как UML не определяет ее формат. Например:
* [x>у]
Следует отметить, что разветвление изображается так же, как итерация, но без
звездочки (то есть как итерация, которая происходит всего один раз).
Нотация итерации предполагает, что повторяющиеся сообщения будут выполняться
последовательно. Однако их также можно осуществлять и параллельно. В атом случае
к нотации (после звездочки) добавляется изображение двух параллельных вертикальных
линий (| |).
Обратите внимание, что структура вложенного управления не допускает повтора
рекуррентности на внутренних уровнях. На каждом из уровней определяется своя
собственная итерация.
Сигнатура. Сигнатура - это строка, в которой указывается имя, аргументы и возвращаемое
значение; операции, сообщения или сигнала. У них могут быть следующие свойства:
список - возвращаемых-
значений
Список имен, разделенный запятыми. Содержит значения, которые возвращает сообщение
при последовательном выполнении общего взаимодействия. Эти идентификаторы могут
использоваться в качестве аргументов последующих сообщений. Если сообщение не
возвращает значение, то возвращаемое значение и оператор присваивания не указываются.
имя - сообщения
Имя события, возникающего в целевом объекте (нередко это событие запрашивает
выполнение какой-либо операции). Это событие можно реализовать различными способами,
один из которых - вызов операции. Если событие реализовано как вызов процедуры,
то ими будет обозначать имя операции, которая должна быть определена в классе
объекта-получателя или же наследоваться в нем. Во всех других случаях оно может
быть именем события, которое возникает в объекте-получателе. На практике при
перегрузке операций для идентификации операции требуется как имя сообщения,
гак и список типов аргументов.
список - аргументов
Взятый в круглые скобки список аргументов, разделенных запятыми. Скобки можно
использовать даже тогда, когда список пуст. Каждый аргумент представляет собой
выражение, написанное в псевдокоде или в соответствующем языке программирования
(UML не задаст его форму). В выражениях могут использоваться значения, возвращенные
предыдущими сообщениями (в той же области действия), а также выражения навигации,
начинающиеся у исходного объекта (атрибуты этого объекта, исходящие из него
связи, а также маршруты, к которым от этих связей есть доступ).
Пример
Ниже мы приводим примеры синтаксиса меток сообщений.
2: display (х, у) Простое сообщение
1.3.1: p:=find(specs) Вложенный вылов с возвращаемым значением
[х<0] 4: invert (x, color) Обусловленное сообщение
3.1*: update ( ) Итерация
АЗ,В4/ С2: сору(а,Ь) Синхронизация с другими потоками
Варианты презентации
Вместо текстовых выражений для аргументов возвращаемых значений около сообщений
могут изображаться маркеры данных (рис. 123). Маркер представляет собой маленький
кружок, около которого указывается выражение, описывающее аргумент или имя возвращаемого
значения. Если маленькая стрелка над маркером указывает в направлении сообщения,
то маркер обозначает аргумент, если же она направлена в противоположную сторону,
то он обозначает возвращаемое значение. Вы можете использовать как текстовый
синтаксис, так и маркеры, однако текстовый вариант нотации более компактен,
поэтому Б большинстве случаев он будет удобнее.
Рис. 123. Значки для потока значений
Синтаксис сообщений можно выражать посредством синтаксиса языка программирования,
например C++ или Smalltalk. При этом на одной диаграмме должен использоваться
только один вид синтаксиса.