ZuboLom.ru

Диаграммы взаимодействий

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

На такой диаграмме отображается ряд объектов и те сообщения, которыми они обмениваются между собой.

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

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

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

Императивное сообщение - это сообщение, запрашивающее у объекта получателя выполнение действий.


Диаграммы-последовательности

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

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

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

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

Стрелки соответствуют сообщениям, передаваемым между действующим лицом и объектом или между объектами для выполнения требуемых функций. На диаграмме последовательности объект изображается в виде прямоугольника на вершине пунктирной вертикальной линии. Эта линия называется "линией жизни" (life line) объекта. Она представляет собой фрагмент жизненного цикла объекта в процессе взаимодействия.

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

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

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


Кооперативные диаграммы

кооперативные диаграммы

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

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


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

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

Диаграмма-состояние "Банковский счет"

диаграмма-состояние


(1) - Снятие денег [отрицательный баланс]
(2) - Вклад денег [положительный баланс]
(3) - Клиент требует закрыть/сохранить дату закрытия
(3) и (4) - Проверка баланса [отрицательный баланс в течение более 30 дней]

В примере можно наблюдать процесс перехода счета из одного состояния в другое. Требование клиента называется "событием". Именно такие события и вызывают переход из одного состояния в другое. Если клиент снимает деньги со счета, он может перейти в состояние превышение кредита. Это происходит только в том случае, если банк по счету меньше нуля, что отражено условием "отрицательный баланс". Заключенное в квадратные скобки условие определяет, когда может произойти переход из одного состояния в другое.

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

Когда объект находится в каком-то конкретном состоянии, могут выполняться различные процессы. В нашем примере при превышении кредита клиенту посылается соответствующее сообщение.

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

Рассмотрим каждый из них в контексте диаграммы состояние для класса банковский счет:

  1. Деятельность - это поведение реализуемое объектом, пока он находится в данном состоянии. Например, когда счет находится в состоянии "закрыт" происходит возврат кредитной карточки пользователю.
    Деятельность - это прерываемое поведение, оно может выполняться до своего завершения, пока объект находится в данном состоянии или может быть прервано переходом объекта в другое состояние. Деятельность изображают внутри самого состояния. Ее обозначению должно предшествовать "do: "
  2. Входное действие - это поведение, которое выполняться, когда объект переходит в данное состояние.
    Как только счет в банке переходит в состояние превышения кредита, выполняется действие "временно заморозить счет" независимо от того, откуда объект перешел в это состояние. Т.е. данное действие осуществляется не после того как объект перешел в это состояние, а скорее как часть этого перехода. В отличии от деятельности входное действие рассматривается как непрерываемое. Входное действие также показывают внутри состояния. Его обозначению предшествует слово "entry: ".
  3. Выходное действие подобно входному, однако оно осуществляется как составная часть процессов выхода из данного состояния. В нашем примере при выходе объекта из состояния "превышение кредита" выполняется действие "разморозить счет", оно является частью процесса такого перехода. Как и входное, выходное действие является непрерываемым. Выходные действия изображаются внутри состояния. Его описанию предшествует слово "exit: ".

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

Do: ^ цель.событие(аргументы)
Здесь:
Цель - это объект, получающий события
Событие - это посылаемое сообщение
Аргументы - это параметры посылаемого сообщения.

Деятельность может также выполняться в результате получения объектом некоторого события. Например: объект "банковский счет" может быть в состоянии "открыт". При получении некоторого сообщения выполняется определенная деятельность.

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

Рассмотрим каждое из них в контексте примера банковской системы:

  1. Событие - это то, что вызывает переход из одного состояния в другое. Например, событие "клиент требует закрыть" вызывает переход счета из открытого в закрытое состояние. Событие размещают на диаграмме вдоль линии перехода.
    На диаграмме для отображения события можно использовать как имя операции, так и обычную фразу. В нашем примере события описаны обычными фразами. Если нужно использовать операцию, то данное событие можно назвать RequestClosure().
    У события могут быть аргументы такие как событие "сделать вклад", вызывающее переход счета из состояния превышения кредита в состояние "открыто", а может иметь аргумент, называемый Amount, описывающий сумму депозита.
    Большинство переходов должны иметь события, т.к. именно они, прежде всего, заставляют переход осуществиться. Тем не менее, бывают и автоматические переходы, не имеющие событий, при этом объект сам перемещается из одного состояния в другое со скоростью позволяющей осуществиться входным действиям деятельности и выходным действиям.
  2. Ограждающее условие - определяет, когда переход может или не может осуществиться. В нашем примере событие сделать вклад переведет счет из состояния "открыт", но только при условии, если баланс больше нуля. В противном случае переход не осуществиться.
    Ограждающее условие изображают на диаграмме вдоль линий перехода, после имени события заключают их в квадратные скобки. Ограждающее условие задавать не обязательно, однако если существуют несколько автоматических переходов из состояний необходимо определять для них взаимоисключающие ограждающие условия. Это поможет читателю диаграммы понять, какой путь перехода будет автоматически выбран.
  3. Действие являются непрерывным поведением, которое осуществляется как часть перехода. Входные и выходные действия показывают внутри состояния, поскольку они определяют, что происходит, когда объект входит или выходит из состояния. Тем не менее, большую часть действий изображают вдоль линии перехода, так как они не должны осуществляться при входе или выходе из состояния. Например, при переходе счета из открытого в закрытое состояние выполняется действие "сохранить дату закрытия счета". Это непрерываемое поведение осуществляется только во время перехода из состояния "открыт" в состояние "закрыт".
    Действие рисуют вдоль линии перехода после имени события, его изображению предшествует косая черта.
  4. Посылаемое событие. Событие или действие может быть поведением внутри объекта, а может представлять собой сообщение, посылаемое другому объекту. Если событие или действие посылается другому объекту, перед ним на диаграмме помещают знак "^".

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