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

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

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

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

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

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

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

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

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

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

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

<Предшествующие сообщения> / <Порядковый номер сообщения>:

<Возвращаемое значение := имя сообщения> <(Список аргументов)>

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

Порядковый номер сообщения - это разделенный точками список чисел, после которого записывается двоеточие. Каждое из чисел представляет отдельный уровень вложенности номера. Например, объект отправил другому объекту сообщение с номером 1. Когда объект-получатель в свою очередь отправляет сообщения другим объектам, они получают номера 1.1, 1.2 и т. д. Иногда нужно показать одновременную отправку сообщений. Чтобы отметить параллельные потоки сообщений, их номера предваряют буквами A, B, C, D и т. д. Необходимость номера сообщения объясняется очень просто - в отличие от диаграммы последовательностей, время на диаграмме взаимодействия не показывается в виде отдельного измерения. Поэтому последовательность передачи сообщений можно указать только с помощью их нумерации.

После номера можно указать рекуррентность (показывает итеративный или условный характер выполнения передачи сообщений):

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

· [Предложение-условие] - используется для записи условия передачи сообщения по данной ветви. Передача возможна только при истинности записанного условия. В общем случае предложение-условие - обычное булевское выражение и может быть записано на обычном тексте, псевдокоде или некотором языке программирования.

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

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

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

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

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

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

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

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

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

Пример. На рисунке 10 представлена диаграмма кооперации, описывающая покупку товаров. Сообщение с номером 1.1 предполагает итеративное выполнение для формирования списка заказанных товаров (используется *). Также анонимный объект класса Order отправляет сам себе рефлексивное сообщение с номером 1.2, инициируя выполнение вычисления итоговой суммы заказа. На диаграмме показано, что результат этого сообщения будет присвоен переменной (атрибуту) orderTotal (возвращаемое значение).

 

Рис. 10. Диаграмма кооперации, описывающая покупку товаров.

Пример. На рисунке 11 представлена диаграмма кооперации, на которой отображено выполнение сообщения с номером 2 параллельно двумя объектами - nsLights и ewLights (А2, В2). Сообщение с номером 3 также выполняется параллельно двумя объектами - nsSignals и ewSignals (С3, D3).

Рис. 11. Диаграмма кооперации, описывающая параллельные потоки сообщений.