Сравнение диаграммы последовательности и диаграммы кооперации

 

Диаграммы последовательностей и кооперативные диаграммы (и те, и другие называются диаграммами взаимодействий) относятся к числу пяти видов диаграмм, применяемых в UML для моделирования динамических аспектов системы.

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

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

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

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

У кооперативной диаграммы есть два свойства, которые отличают их от диаграмм последовательностей.

Первое – это путь. Для описания связи одного объекта с другим к дальней концевой точке этой связи можно присоединить стереотип пути (например, local, показывающий, что помеченный объект является локальным по отношению к отправителю сообщения). Имеет смысл явным образом изображать путь связи только в отношении путей типа local, parameter, global и self (но не associations).

Второе свойство – это порядковый номер сообщения. Для обозначения временной последовательности перед сообщением можно поставить номер (нумерация начинается с единицы), который должен постепенно возрастать для каждого нового сообщения (2, 3 и. т.д.). Для обозначения вложенности используется десятичная нотация Дьюи (1 – первое сообщение; 1.1– первое сообщение, вложенное в сообщение 1; 1.2 – второе сообщение, вложенное в сообщение 1 и т.д.). Уровень вложенности не ограничен. Для каждой связи можно показать несколько сообщений (вероятно, посылаемых разными отправителями), и каждое из них должно иметь уникальный порядковый номер.

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

Диаграммы взаимодействий используются для моделирования динамических аспектов системы. Речь идет о взаимодействии экземпляра, любой разновидности в любом представлении системной архитектуры, включая экземпляры классов, в том числе активных, интерфейсов, компонентов и узлов.

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

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

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

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

Моделирование временной упорядоченности потока управления осуществляется следующим образом:

– установите контекст взаимодействия, будь то система, подсистема, операция, класс или один из сценариев варианта использования либо кооперативные диаграммы.

– определите сцену для взаимодействия, выяснив, какие объекты принимают в нем участие.

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

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

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

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

– если необходимо специфицировать временные или пространственные ограничения, дополните сообщения отметками времени и присоедините соответствующие ограничения.

– для более строгого и формального описания потока управления присоедините к каждому сообщению пред– и постусловия.

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

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

Моделирование структурной организации потоков управления состоит из следующих шагов:

– установите контекст взаимодействия. Это может быть система, подсистема, операция, класс или один из сценариев варианта использования либо кооперативная диаграмма.

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

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

– детально опишите связи между объектами, вдоль которых передаются сообщения. Для этого:

– сначала нарисуйте связи–ассоциации. Они наиболее важны, поскольку представляют структурные соединения;

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

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

– если требуется специфицировать временные или пространственные ограничения, дополните сообщения отметками времени и присоедините нужные ограничения.

– если требуется описать поток управления более формально, присоедините к каждому сообщению пред– и постусловия.

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

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

Хорошо структурированная диаграмма взаимодействий обладает следующими свойствами:

акцентирует внимание только на одном аспекте динамики системы;

содержит только такие варианты использования и актеры, которые важны для понимания этого аспекта;

содержит только такие детали, которые соответствуют данному уровню абстракции, и только те дополнения, которые необходимы для понимания системы;

не настолько лаконична, чтобы ввести читателя в заблуждение относительно важных аспектов семантики.

 

 

Диаграммы состояний

 

Диаграмма состояний (Statechart diagram) показывает автомат, фокусируя внимание на потоке управления от состояния к состоянию. Диаграмма состояний изображается в виде графа с вершинами и ребрами.

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

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

Диаграмму состояний не требуется создавать для каждого класса. Многие проекты вообще обходятся без них. Если динамика класса важна, то для него полезно создать диаграмму состояний. Такие классы обычно имеют много различных состояний, то есть поведение объекта такого класса существенно, и есть смысл его моделировать. Поведение таких классов, естественно, управляется событиями.

Два основных элемента диаграммы состояний – это состояния и переходы между ними.

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

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

 

Рис. 6.48. Состояние

 

Например, телефон находится в состоянии ожидания, если трубка положена.

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

Действие (Action) – это атомарное вычисление, которое приводит к смене состояния или возврату значения.

Действия могут быть трех типов: входные, выходные и деятельность. Рассмотрим типы действий позднее.

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

Переходом называется перемещение объекта из одного состояния в другое. Переход изображается в виде линии со стрелкой (рис. 6.49.).

 

Рис. 6.49. Переход

 

Переходы могут быть рефлексивными (рис. 6.50.), то есть объект переходит в то же состояние, в котором он находится.

 

Рис. 6.50. Рефлексный переход

 

На переходах можно записывать события и действия (рис. 6.51.).

 

Рис. 6.51. Переход с событием и действием

 

Событие (Event) – это спецификация существенного факта, который происходит во времени и пространстве. В контексте автоматов событие – это стимул, способный вызвать срабатывание перехода.

Событие – определяет условие, когда переход может быть выполнен. Событием может быть объект (класс) или операция (чаще всего). Событие можно описать обычной фразой. Например: “Выполнить заказ ”, “Отменить заказ”.

Если событием является операция, то у нее могут быть аргументы.

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

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

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

Например, при переходе объекта "Счёт" из открытого в закрытое состояние должно выполняться действие "Сохранить дату закрытия счёта" (рис. 6.52.).

 

Рис. 6.52. Переход объекта из открытого в закрытое состояние

 

Такие действия размещают вдоль линии перехода после имени события (ему предшествует косая черта “/”).

Рассмотрим более подробно детали (действия), которые объект может выполнять, находясь в конкретном состоянии. Итак, с состоянием можно связать данные (операции) трех типов:

деятельность;

входное действие;

выходное действие.

Деятельность (Activity) – это продолжающееся неатомарное вычисление внутри автомата.

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

Рис. 6.53. Деятельность

 

Деятельность может выполняться также в результате получения объектом некоторого сообщения (операции).

Входное действие –это поведение, которое всегда выполняется, когда объект переходит в данное состояние (независимо, из какого состояния). Входное действие осуществляется не после того, как объект перешел в состояние, а скорее как часть перехода в данное состояние. И поэтому оно рассматривается как непрерываемое. Ему на состоянии предшествует слово entry (рис. 6.54.).

 

Рис. 6.54. Входное действие

 

Выходное действие – это действие подобно входному действию, но осуществляется как составная часть процесса выхода из состояния, независимо от того, куда объект переходит (в какое состояние), то есть выходное действие является частью процесса перехода объекта в другое состояние и является поэтому непрерываемым. Ему предшествует слово exit (рис. 6.55.).

 

Рис. 6.55. Выходное действие

 

Поведение объекта во время деятельности, входных и выходных действий может включать в себя отправку сообщения другому объекту. Например, do: ^цель.Операция (Аргументы), где знак "^" указывает, что объект в данном состоянии отправляет сообщение объекту «цель».

На диаграмме состояний обычно указывают два специальных состояния объекта – начальное и конечное (Start и Stop).

Начальное состояние – это то состояние, в котором объект находится сразу после своего создания. Изображается в виде закрашенного кружочка (рис. 6.56.).

 

Рис. 6.56. Начальное состояние

 

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

Конечное состояние – это то состояние, в котором объект находится непосредственно перед уничтожением. Его изображают в виде значка «бычий глаз» (рис. 6.57.).

 

Рис. 6.57. Конечное состояние

 

Конечное состояние не является обязательным, и их может быть сколько угодно.

Для упорядочивания состояний на диаграмме их можно вкладывать друг друга. Вложенные состояния называются подсостояниями (Substates), а те, в которые они вложены, – суперсостояниями (Superstates).

Состояния обычно вкладываются (группируются), если у них имеются идентичные переходы. Тогда есть смысл сгруппировать их вместе в суперсостояние, которое будет поддерживать одинаковые переходы вложенных состояний. На диаграмме состояний будет меньше переходов, то есть говорят «навести порядок» на диаграмме.

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